2010-01-06 17 views
11

Se han formulado varios aspectos de esta pregunta pero aún no he encontrado una respuesta correcta.ASP.NET: obtenga la altura y el ancho de una imagen

Supongo que tengo una imagen .jpg en el servidor de archivos y que necesito obtener su altura y ancho. ¿Cómo lo hago en asp.net?

que he visto algunas respuestas que sugiere que hacer algo como esto:

System.Drawing.Image image=System.Drawing.Image.FromFile(PicturePath); 
int ActualWidth=image.Width; 
int ActualHeight=image.Height; 
image.Dispose(); 

esto funcionaría bien, excepto que classes within the System.Drawing namespace are not supported for use within an ASP.NET service.

Entonces, ¿cómo se obtiene la altura y el ancho real de una imagen en ASP.net?

+1

Relacionado, aunque con una pregunta diferente: http://stackoverflow.com/questions/390532/system-drawing-in- windows-or- asp-net-services – jball

+1

Image.FromStream (flujo, falso) cargará el ancho y alto sin analizar todos los datos de la imagen. Asegúrate de disponer de la imagen seguida de la transmisión y estarás bien. La advertencia está ahí porque el programador promedio es demasiado perezoso para manejar la administración de memoria manual correctamente. –

Respuesta

0

Eso dice Servicio, no Aplicación. Eso funcionará bien.

+0

El proceso de trabajo ASP no se ejecuta como un servicio? – jball

+0

http://dotnet.org.za/eduard/archive/2004/09/23/4226.aspx – jball

7

añadir un control de imagen del lado del servidor en el aspx

<asp:image ID="img1" runat="server" src="" /> 

y en el código detrás de él dar una src

img1.src = System.Drawing.Image.FromFile(PicturePath); 

int ActualWidth = img1.Width; 
int ActualHeight = img1.Height; 
img1.src = ""; 
+0

System.Drawing no debe utilizarse en ASP.net de acuerdo con la página de MSDN mencionada en la pregunta. – Anthony

+2

img1.src no funciona de todos modos. Probablemente quiso decir img1.ImageUrl – Anthony

+0

si exactamente eso – Hiyasat

1

Para evitar el uso del espacio de nombres System.Drawing:

Para GIF, el alto y el ancho son enteros de 4 bytes que se encuentran en el encabezado del archivo. (0x12 Dirección de la anchura, la altura 0x16)

Para archivos JPG que usted podría intentar escribir una función como la que se encuentra aquí: http://www.64lines.com/jpeg-width-height Pasa en el JPG como una matriz de datos y que llega a la altura y anchura.

+0

Gracias pero su enlace no funciona. – Anthony

+0

Lo siento Anothony, lo arreglé. –

1

Mayo esta ayuda

string lPath = Server.MapPath("~\\Images1\\") + dsProd.Tables[0].Rows[i]["Image1"].ToString(); 

Image1.ImageUrl = "Images1\\" + dsProd.Tables[0].Rows[i]["Image1"].ToString(); 
Image2.ImageUrl = "Images1\\" + dsProd.Tables[0].Rows[i]["Image2"].ToString(); 


string currentImagePath = lPath.ToString();// Session["FullImagePath"] + "\\" + GetCurrentFileName(); 
Bitmap bmp = new Bitmap(currentImagePath); 



int iActualWidth=0,iActualHeight=0; 
for (int j = 1; j <= 100; j++) 
{ 
    if ((bmp.Width/j) > 150) 
    { 
      iActualWidth = bmp.Width/j; 
      iActualHeight = bmp.Height/j; 
    } 
    else 
    { 
     break; 
    } 
} 

Image1.Height = new Unit(iActualHeight); 
Image1.Width = new Unit(iActualWidth); 
-1

importaciones System.Drawing.Image, System.IO

Dim image As System.Drawing.Image 

image = image.FromFile([filepath]) 

If image.Width > 440 Or image.Height > 440 Then 
'show resized 
else 
'leave as is 
end if 
+1

¿Cuál es la diferencia con el código en la pregunta? – Anthony

0

me he convertido código C++ a C# para futuras referencias:

static bool get_jpeg_size(byte[] data, int data_size, ref int width, ref int height) 
{ 
    //Check for valid JPEG image 
    int i = 0; // Keeps track of the position within the file 
    if (data[i] == 0xFF && data[i + 1] == 0xD8 && data[i + 2] == 0xFF && data[i + 3] == 0xE0) 
    { 
     i += 4; 
     // Check for valid JPEG header (null terminated JFIF) 
     if (data[i + 2] == 'J' && data[i + 3] == 'F' && data[i + 4] == 'I' && data[i + 5] == 'F' && data[i + 6] == 0x00) 
     { 
      //Retrieve the block length of the first block since the first block will not contain the size of file 
      var block_length = data[i] * 256 + data[i + 1]; 
      while (i < data_size) 
      { 
       i += block_length;    //Increase the file index to get to the next block 
       if (i >= data_size) return false; //Check to protect against segmentation faults 
       if (data[i] != 0xFF) return false; //Check that we are truly at the start of another block 
       if (data[i + 1] == 0xC0) 
       {   //0xFFC0 is the "Start of frame" marker which contains the file size 
        //The structure of the 0xFFC0 block is quite simple [0xFFC0][ushort length][uchar precision][ushort x][ushort y] 
        height = data[i + 5] * 256 + data[i + 6]; 
        width = data[i + 7] * 256 + data[i + 8]; 
        return true; 
       } 
       else 
       { 
        i += 2;        //Skip the block marker 
        block_length = data[i] * 256 + data[i + 1]; //Go to the next block 
       } 
      } 
      return false;      //If this point is reached then no size was found 
     } 
     else { return false; }     //Not a valid JFIF string 

    } 
    else { return false; }      //Not a valid SOI header 
} 

USO:

using (var stream = File.OpenRead(path)) 
{ 
    using (var m = new MemoryStream()) 
    { 
     stream.CopyTo(m); 
     var arr = m.ToArray(); 
     int w = 0, h = 0; 

     get_jpeg_size(arr, arr.Length, ref w, ref h); 
     Console.WriteLine(w + "x" + h); 
    } 
} 
-1
Imports System.IO 

Imports System.Drawing         

Dim sFile As Stream = fuPhoto2.PostedFile.InputStream 

Dim img As System.Drawing.Image = System.Drawing.Image.FromStream(sFile) 

If img.PhysicalDimension.Width > 700 And img.PhysicalDimension.Height > 300 Then 

    strPhotoName = fuPhoto2.FileName 

    fuPhoto2.SaveAs(Server.MapPath("~/Images/") + 
fuPhoto2.FileName)         

Else 

    lblErrMeg2.Text = "Image size must be greater than 700 X 300!" 

    fuPhoto2.Focus() 

    Exit Sub 

End If 
+1

System.Drawing no se debe utilizar en ASP.net según la página de MSDN mencionada en la pregunta. Su variable "img" está basada en eso. Además, ¿cuál sería la diferencia entre img.PhysicalDimension.Width e img.Width (utilizado en la pregunta)? – Anthony

1

Puede usar la clase "bitmap".

C#

Bitmap bitmap = new Bitmap(filepath); 

int iWidth = bitmap.Width; 
int iHeight = bitmap.Height; 

VB

Dim bitmap As New Bitmap(filepath) 

Dim iWidth As Integer = bitmap.Width 
Dim iHeight As Integer = bitmap.Height 
0

importaciones iTextSharp.text

sólo las herramientas que se utilizan en la creación de un PFD.

  Dim URel As String 
      URel = "https://......." 

      Dim pic As iTextSharp.text.Image 
      pic = iTextSharp.text.Image.GetInstance(URel) 
      Dim sizee As String 
      sizee = pic.Height 
      SOURR = "<img src='" & URel & "' alt='' />" 
0

tuve mis imágenes en una vista de lista como un ImageButton y necesitaba su anchura y altura, así que encontré la solución aquí: http://forums.asp.net/t/1262878.aspx?how+to+get+the+image+width+and+height+argh

y es mi código de trabajo:

ListViewItem item = e.Item; 
    ImageButton img = item.FindControl("img") as ImageButton; 

    FileStream fs = new FileStream(MapPath(img.ImageUrl) , FileMode.Open, FileAccess.Read, FileShare.Read); 
    System.Drawing.Image dimg = System.Drawing.Image.FromStream(fs); 
    int width = Convert.ToInt32(dimg.Width); 
    int height = Convert.ToInt32(dimg.Height); 

Espero que te ayude

Cuestiones relacionadas