【问题标题】:ASP.NET: get height and width of an image [duplicate]ASP.NET:获取图像的高度和宽度
【发布时间】:2011-01-02 05:42:36
【问题描述】:

这个问题已经被问过各种各样的问题,但我还没有找到正确的答案。

假设我在文件服务器上有一个 .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 中获取图像的实际高度和宽度?

【问题讨论】:

  • 相关,但问题不同:stackoverflow.com/questions/390532/…
  • Image.FromStream(stream, false) 将在不解析所有图像数据的情况下加载宽度和高度。确保你在流之后处理图像,你会没事的。出现警告是因为普通程序员懒得正确处理手动内存管理。

标签: asp.net image


【解决方案1】:

说的是服务,而不是应用程序。这样就可以了。

【讨论】:

【解决方案2】:

在 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 = "";

【讨论】:

  • 根据问题中提到的 MSDN 页面,不应在 ASP.net 中使用 System.Drawing。
  • img1.src 无论如何都不起作用。你的意思可能是 img1.ImageUrl
  • 从问题内容来看,这显然是错误的,怎么会有这么多的赞成票?
【解决方案3】:

希望对您有帮助

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

【讨论】:

    【解决方案4】:

    导入 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
    

    【讨论】:

    • 问题中的代码有什么区别?
    【解决方案5】:

    我已将 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);
        }
    }
    

    【讨论】:

      【解决方案6】:
      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
      

      【讨论】:

      • System.Drawing 不应根据问题中提到的 MSDN 页面在 ASP.net 中使用。您的“img”变量是基于它的。另外,img.PhysicalDimension.Width 和 img.Width (在问题中使用)有什么区别?
      【解决方案7】:

      您可以使用“位图”类。

      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
      

      【讨论】:

      • 有效。漂亮而简单。
      【解决方案8】:

      导入 iTextSharp.text

      只是创建 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='' />"
      

      【讨论】:

        【解决方案9】:

        我将图像作为 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);
        

        希望对你有帮助

        【讨论】: