2010-01-06 6 views
11

Были заданы различные вкусы этого вопроса, но я еще не нашел правильного ответа.ASP.NET: получить высоту и ширину изображения

Скажем, у меня есть изображение .jpg на файловом сервере и что мне нужно получить его высоту и ширину. Как это сделать в asp.net?

Я видел несколько ответов, которые предлагают сделать что-то вроде этого:

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

Это будет работать нормально, за исключением того classes within the System.Drawing namespace are not supported for use within an ASP.NET service.

Итак, как вы можете получить фактическую высоту и ширину изображения в ASP.net?

+1

Связанный, хотя другой вопрос: http://stackoverflow.com/questions/390532/system-drawing-in-windows-or-asp-net-services – jball

+1

Image.FromStream (stream, false) будет загружать ширину и высоту без разбора всех данных изображения. Удостоверьтесь, что вы выбрали образ, за ​​которым следует поток, и все будет в порядке. Предупреждение существует, потому что средний программист слишком ленив, чтобы правильно управлять ручным управлением памятью. –

ответ

0

Что говорит Услуга, а не Приложение. Это будет прекрасно.

+0

Рабочий процесс ASP не запускается как служба? – jball

+0

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

7

добавить контроль изображения на стороне сервера на ASPX

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

и на коде позади дать ему SRC

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

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

System.Drawing не должен использоваться в ASP.net согласно странице MSDN, указанной в вопросе. – Anthony

+2

img1.src не работает. Вы, вероятно, имели в виду img1.ImageUrl – Anthony

+0

да именно то, что – Hiyasat

1

Для того, чтобы избежать использования пространства имен System.Drawing:

Для GIF, высота и ширина - это 4-байтовые целые числа, найденные в заголовке файла. (Адрес 0x12 для ширины, 0x16 по высоте)

Для JPGs вы можете попробовать написать функцию, как найденному здесь: http://www.64lines.com/jpeg-width-height Она проходит в формате JPG в виде массива данных и получает ширину и высоту.

+0

Спасибо, но ваша ссылка не работает. – Anthony

+0

Извините, Антония, исправил это. –

1

мая эта помощь

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

Импорт 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

В чем разница с кодом в вопросе? – Anthony

0

Я переделанный C++ код на C# для дальнейшего использования:

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 
} 

ИСПОЛЬЗОВАНИЕ:

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 не должен использоваться в ASP.net согласно странице MSDN, указанной в вопросе. Ваша переменная «img» основана на ней. Кроме того, какая разница между img.PhysicalDimension.Width и img.Width (используется в вопросе)? – Anthony

1

Вы можете использовать класс «битмап».

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

Импорт iTextSharp.text

только инструменты, используемые при создании ОФП.

  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

У меня были свои образы в ListView как ImageButton и я нуждался в их ширину и высоту, так что я нашел решение здесь: http://forums.asp.net/t/1262878.aspx?how+to+get+the+image+width+and+height+argh

и его мой рабочий код:

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); 

Я надеюсь, что это поможет вам

Смежные вопросы