ASP.NET: получить высоту и ширину изображения

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

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

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

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

Это будет работать отлично, за исключением того, что классы в пространстве имен System.Drawing не поддерживаются для использования в службе ASP.NET.

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

Ответ 1

добавить элемент управления на стороне сервера на 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 = "";

Ответ 2

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

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

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

Ответ 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

Вы можете использовать класс "bitmap".

С#

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

Ответ 5

Это говорит Сервис, а не Приложение. Это будет работать нормально.

Ответ 6

Я преобразовал код С++ в С# для справки в будущем:

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

Ответ 7

Импортирует 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='' />"

Ответ 8

У меня были изображения в списке в виде 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);

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

Ответ 9

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

Ответ 10

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