Загрузка изображений ASP.NET с изменением размера

У меня есть страница aspx, которая будет загружать изображения на жесткий диск сервера с клиентского компьютера

Но теперь мне нужно изменить мою программу таким образом, чтобы я мог изменять размер изображения при загрузке.

Кто-нибудь знает об этом? Мне не удалось найти такие свойства / методы с серверным управлением входного файла

Есть кто-нибудь, чтобы направить меня?


person user29982    schedule 31.10.2008    source источник
comment
Как вы загружаете с сервера на клиент?   -  person ine    schedule 31.10.2008
comment
Я предлагаю использовать бесплатную библиотеку с открытым исходным кодом @ Image Resizing In .NET, чтобы сделать это в одной строке кода. . Другие ответы (в настоящее время) подвержены одной или нескольким из распространенных ошибок.   -  person Lilith River    schedule 25.04.2011
comment
ImageBuilder.Current.Build (HttpPostedFile f, строка destinationFilename, new ResizeSettings (maxwidth = 200 & maxheight = 200));   -  person Lilith River    schedule 25.04.2011
comment
Вот пример использования jCrop с ImageResizing.Net libaray.   -  person Lilith River    schedule 07.06.2011
comment
o_O Я чувствую, что компьютерный лингвист имеет отношение к изменению размера изображения в .Net   -  person Lloyd Powell    schedule 07.11.2011
comment
Да, это я, автор. Извините, что забыл тег [полное раскрытие], обычно я этого не делаю.   -  person Lilith River    schedule 23.11.2011


Ответы (13)


После того, как файл был сохранен на сервере, вы можете использовать подобный код для изменения размера. Этот код позаботится о соотношении длины / ширины при изменении размера.

public static Bitmap CreateThumbnail(string lcFilename, int lnWidth, int lnHeight)
{

    System.Drawing.Bitmap bmpOut = null;

    try
    {
        Bitmap loBMP = new Bitmap(lcFilename);
        ImageFormat loFormat = loBMP.RawFormat;

        decimal lnRatio;
        int lnNewWidth = 0;
        int lnNewHeight = 0;

        if (loBMP.Width < lnWidth && loBMP.Height < lnHeight)
            return loBMP;

        if (loBMP.Width > loBMP.Height)
        {
            lnRatio = (decimal)lnWidth / loBMP.Width;
            lnNewWidth = lnWidth;
            decimal lnTemp = loBMP.Height * lnRatio;
            lnNewHeight = (int)lnTemp;
        }
        else
        {
            lnRatio = (decimal)lnHeight / loBMP.Height;
            lnNewHeight = lnHeight;
            decimal lnTemp = loBMP.Width * lnRatio;
            lnNewWidth = (int)lnTemp;
        }


        bmpOut = new Bitmap(lnNewWidth, lnNewHeight);
        Graphics g = Graphics.FromImage(bmpOut);
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
        g.FillRectangle(Brushes.White, 0, 0, lnNewWidth, lnNewHeight);
        g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight);

        loBMP.Dispose();
    }
    catch
    {
        return null;
    }
    return bmpOut;
}
person JPrescottSanders    schedule 31.10.2008
comment
Немного OT из вопроса, но насколько хорошо это обрабатывает изображения с низким разрешением? Я всегда получаю искаженные изображения с моими. - person Tim Meers; 26.03.2010
comment
Я обычно проталкивал изображения с высоким разрешением через этот код, поэтому я не могу дать вам хороший ответ. Честно говоря, довольно легко подключиться к приложению и протестировать, так что вы можете просто попробовать, я не думаю, что это будет стоить вам значительного количества времени. - person JPrescottSanders; 27.03.2010
comment
Вы получите 50% белую (или черную) линию на внешней границе изображения, если только вы не используете TileModeXY в экземпляре ImageAttributes во время вызова DrawImage .. - person Lilith River; 06.01.2012
comment
См. stackoverflow.com/questions/ 6821261 / - person Lilith River; 19.06.2012

Вы не сможете изменять размер «на лету», так как вам потребуется полное изображение, прежде чем выполнять какие-либо преобразования изображения. Однако после завершения загрузки и до того, как вы отобразите какие-либо результаты для своего пользователя, вы можете использовать этот базовый метод изменения размера изображения, который я использовал сейчас в нескольких своих приложениях:

   ''' <summary>
   '''    Resize image with GDI+ so that image is nice and clear with required size.
   ''' </summary>
   ''' <param name="SourceImage">Image to resize</param>
   ''' <param name="NewHeight">New height to resize to.</param>
   ''' <param name="NewWidth">New width to resize to.</param>
   ''' <returns>Image object resized to new dimensions.</returns>
   ''' <remarks></remarks>
   Public Shared Function ImageResize(ByVal SourceImage As Image, ByVal NewHeight As Int32, ByVal NewWidth As Int32) As Image

      Dim bitmap As System.Drawing.Bitmap = New System.Drawing.Bitmap(NewWidth, NewHeight, SourceImage.PixelFormat)

      If bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format1bppIndexed Or _
          bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format4bppIndexed Or _
          bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format8bppIndexed Or _
          bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Undefined Or _
          bitmap.PixelFormat = Drawing.Imaging.PixelFormat.DontCare Or _
          bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format16bppArgb1555 Or _
          bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format16bppGrayScale Then
         Throw New NotSupportedException("Pixel format of the image is not supported.")
      End If

      Dim graphicsImage As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bitmap)

      graphicsImage.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
      graphicsImage.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
      graphicsImage.DrawImage(SourceImage, 0, 0, bitmap.Width, bitmap.Height)
      graphicsImage.Dispose()
      Return bitmap

   End Function
person Dillie-O    schedule 31.10.2008
comment
+1 за указание на то, что изменение размера изображения должно выполняться после загрузки всего изображения. - person quakkels; 20.06.2010

Другой подход - позволить пользователю настроить размер в браузере, а затем изменить размер изображения, как описано в других ответах.

Так что взгляните на это решение, которое позволяет загружать и обрезать изображения с помощью jQuery, jCrop и ASP.NET.

person Naeem Sarfraz    schedule 23.02.2010

Как изменить размер и загрузить изображение только для расширений .jpg:
На странице upload.aspx

    <asp:FileUpload ID="ProductImage" runat="server"/>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Upload" />
 <asp:TextBox runat="server" ID="txtProductName" CssClass="form-control" />
                        <asp:RequiredFieldValidator runat="server" ControlToValidate="txtProductName" ErrorMessage="The Product name field is required." />

И upload.aspx.cs
Для изменения размера

/// <summary>
/// Created By Rajib Chowdhury Mob. 01766-306306; Web: http://onlineshoping.somee.com/
/// Complete This Page Coding On January 05, 2014
/// Programing C# By Visual Studio 2013 For Web
/// Dot Net Version 4.5
/// Database Virsion MSSQL Server 2005
/// </summary>
        public bool ResizeImageAndUpload(System.IO.FileStream newFile, string folderPathAndFilenameNoExtension, double maxHeight, double maxWidth)
        {
            try
            {
                // Declare variable for the conversion
                float ratio;
                // Create variable to hold the image
                System.Drawing.Image thisImage = System.Drawing.Image.FromStream(newFile);
                // Get height and width of current image
                int width = (int)thisImage.Width;
                int height = (int)thisImage.Height;
                // Ratio and conversion for new size
                if (width > maxWidth)
                {
                    ratio = (float)width / (float)maxWidth;
                    width = (int)(width / ratio);
                    height = (int)(height / ratio);
                }
                // Ratio and conversion for new size
                if (height > maxHeight)
                {
                    ratio = (float)height / (float)maxHeight;
                    height = (int)(height / ratio);
                    width = (int)(width / ratio);
                }
                // Create "blank" image for drawing new image
                Bitmap outImage = new Bitmap(width, height);
                Graphics outGraphics = Graphics.FromImage(outImage);
                SolidBrush sb = new SolidBrush(System.Drawing.Color.White);
                // Fill "blank" with new sized image
                outGraphics.FillRectangle(sb, 0, 0, outImage.Width, outImage.Height);
                outGraphics.DrawImage(thisImage, 0, 0, outImage.Width, outImage.Height);
                sb.Dispose();
                outGraphics.Dispose();
                thisImage.Dispose();
                // Save new image as jpg
                outImage.Save(Server.MapPath(folderPathAndFilenameNoExtension + ".jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);
                outImage.Dispose();
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

И событие Button1_Click

        string filePath = "~\\Image\\";//your normal image path
        if (Page.IsValid)
        {
            HttpPostedFile myFile = ProductImage.PostedFile;//Get Slected Image
            int nFileLen = myFile.ContentLength;//Get slected Image Size
            string myimag = txtProductName.Text;//Get user input image name
            Guid ImageName = Guid.NewGuid();//get unique id
            if ((myFile != null) && (nFileLen > 1048576))
            {
                LabelAddStatus.Text = "minimum size exceed"; //If file image size 1 MB above
            }
            else
            {
                try
                {
                    if (ProductImage.HasFile)
                    {
                        String fileExtension = System.IO.Path.GetExtension(ProductImage.FileName).ToLower();
                        String[] allowedExtensions = { ".jpg" };//Declare For Allowed Extension
                        for (int i = 0; i < allowedExtensions.Length; i++)
                        {
                            if (fileExtension == allowedExtensions[i])
                            {
                                // Read file into a data stream
                                byte[] myData = new Byte[nFileLen];
                                myFile.InputStream.Read(myData, 0, nFileLen);
                                myFile.InputStream.Dispose();
                                // Save the stream to disk as temporary file. make sure the path is unique!
                                System.IO.FileStream newFile
                                        = new System.IO.FileStream(Server.MapPath(filePath + "_temp.jpg"),
                                                                   System.IO.FileMode.Create);
                                newFile.Write(myData, 0, myData.Length);
                                bool success = ResizeImageAndUpload(newFile, filePath + ("thumbs"+myimag + ImageName), 100, 100);//Save image your thumb image path
                                success = ResizeImageAndUpload(newFile, filePath + (myimag + ImageName), 768, 1024);//Save image your normal image path
                                //delete the temp file.
                                newFile.Close();
                                System.IO.File.Delete(Server.MapPath(filePath + "_temp.jpg"));
                                LabelAddStatus.Text = "File uploaded.";
                            }
                            else
                            {
                                LabelAddStatus.Text = "Unable to accept file type..";
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    //No Exception Message
                }
            }
        }

Спасибо...

person Rajib Chy    schedule 16.02.2014

Вот как я сделал в своем проекте, в зависимости от вашего условия (высота / ширина) вы можете изменить параметр, т.е. (MaxHeight)

 public static System.Drawing.Image ScaleImage(System.Drawing.Image image, int maxHeight)
        {
            var ratio = (double)maxHeight / image.Height;
    
            var newWidth = (int)(image.Width * ratio);
            var newHeight = (int)(image.Height * ratio);
    
            var newImage = new Bitmap(newWidth, newHeight);
            using (var g = Graphics.FromImage(newImage))
            {
                g.DrawImage(image, 0, 0, newWidth, newHeight);
            }
            return newImage;
        }

При нажатии кнопки:

protected void Button1_Click(object sender, EventArgs e)
{
  lblmsg.Text="";
  if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0))
  {
    Guid uid = Guid.NewGuid();
    string fn = System.IO.Path.GetFileName(File1.PostedFile.FileName);
    string SaveLocation = Server.MapPath("LogoImagesFolder") + "\\" + uid+fn;
    try
    {
      string fileExtention = File1.PostedFile.ContentType;
      int fileLenght = File1.PostedFile.ContentLength;
      if (fileExtention == "image/png" || fileExtention == "image/jpeg" || fileExtention == "image/x-png")
      {
        if (fileLenght <= 1048576)
        {
          System.Drawing.Bitmap bmpPostedImage = new System.Drawing.Bitmap(File1.PostedFile.InputStream);
          System.Drawing.Image objImage = ScaleImage(bmpPostedImage, 81);
          objImage.Save(SaveLocation,ImageFormat.Png);
          lblmsg.Text = "The file has been uploaded.";
          lblmsg.Style.Add("Color", "Green");
         }
         else 
         {
           lblmsg.Text = "Image size cannot be more then 1 MB.";
           lblmsg.Style.Add("Color", "Red");
          }
       }
     else {
             lblmsg.Text = "Invaild Format!";
             lblmsg.Style.Add("Color", "Red");
           }
     }
     catch (Exception ex)
       {
          lblmsg.Text= "Error: " + ex.Message;
          lblmsg.Style.Add("Color", "Red");
       }
   }
 }
person Satinder singh    schedule 17.08.2012

Вам нужно будет использовать класс WebClient для загрузки удаленного изображения.

После этого вы можете изменить его размер ... Используйте DrawImage, а не GetThumbnailImage. Убедитесь, что вы избавились от своих растровых и графических дескрипторов .. (используйте с помощью {}). Установите все настройки качества на высокое.

Возможно, вы захотите взглянуть на исходный код моего популярного средства изменения размера изображений Во-первых ... Это поможет вам избежать некоторых общих проблемных зон.

person Community    schedule 05.11.2008

Чтобы уменьшить размер изображения и получить меньшие размеры, просто внесите изменения ниже

    bmpOut = new Bitmap(lnNewWidth, lnNewHeight, **System.Drawing.Imaging.PixelFormat.Format24bppRgb**);

     Graphics g = Graphics.FromImage(bmpOut);

как вы выше, установите imagem на Format24bppRgb PixelFormat.

и когда вы сохраняете файл, вы также устанавливаете ImageFormat. Нравится:

bmpOut.Save(PathImage, System.Drawing.Imaging.ImageFormat.Jpeg);
person Community    schedule 26.02.2009

Вы можете использовать это, это здорово для меня. Но для меня он плохо обрабатывает изображения с низким разрешением. К счастью, я привык ко многим из них. Просто отправьте ему изображение byte[] и ожидаемый результат, и все будет в порядке.

public static byte[] ResizeImageFile(byte[] imageFile, int targetSize) 
{ 
    using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile))) 
    { 
        Size newSize = CalculateDimensions(oldImage.Size, targetSize); 

        using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb)) 
        { 
            newImage.SetResolution(oldImage.HorizontalResolution, oldImage.VerticalResolution); 
            using (Graphics canvas = Graphics.FromImage(newImage)) 
            { 
                canvas.SmoothingMode = SmoothingMode.AntiAlias; 
                canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; 
                canvas.PixelOffsetMode = PixelOffsetMode.HighQuality; 
                canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize)); 
                MemoryStream m = new MemoryStream(); 
                newImage.Save(m, ImageFormat.Jpeg); 
                return m.GetBuffer(); 
            } 
        } 

    } 
} 

private static Size CalculateDimensions(Size oldSize, int targetSize) 
{ 
    Size newSize = new Size(); 
    if (oldSize.Width > oldSize.Height) 
    { 
        newSize.Width = targetSize; 
        newSize.Height = (int)(oldSize.Height * (float)targetSize / (float)oldSize.Width); 
    } 
    else 
    { 
        newSize.Width = (int)(oldSize.Width * (float)targetSize / (float)oldSize.Height); 
        newSize.Height = targetSize; 
    } 
    return newSize; 
} 
person Tim Meers    schedule 22.02.2010

Вы можете изменить размер перед отправкой на сервер с помощью элемента управления ActiveX. Существует бесплатный компонент загрузки изображений ASP.net (я считаю, что это тот же самый компонент, который на самом деле использует Facebook), доступный здесь:

http://forums.aurigma.com/yaf_postst2145_Image-Uploader-ASPNET-Control.aspx

Дайте мне знать, если это сработает, я думаю о внедрении этого в свои проекты здесь, на работе.

Изменить: похоже, что оболочка для объекта бесплатна, однако сам компонент обойдется вам примерно в 200 долларов. Я подтвердил, что это тот же компонент, который использует Facebook.

person Kyle B.    schedule 31.10.2008

using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

public partial class admin_AddPhoto : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        string reportPath = Server.MapPath("../picnic");

        if (!Directory.Exists(reportPath))
        {
            Directory.CreateDirectory(Server.MapPath("../picnic"));
        }
    }

    protected void PhotoForm_ItemInserting(object sender, FormViewInsertEventArgs e)
    {
        FormView uploadForm = sender as FormView;
        FileUpload uploadedFile = uploadForm.FindControl("uploadedFile") as FileUpload;

        if (uploadedFile != null)
        {
            string fileName = uploadedFile.PostedFile.FileName;
            string pathFile = System.IO.Path.GetFileName(fileName);

            try
            {
                uploadedFile.SaveAs(Server.MapPath("../picnic/") + pathFile);
            }
            catch (Exception exp)
            {
                //catch exception here
            }

            try
            {
                Bitmap uploadedimage = new Bitmap(uploadedFile.PostedFile.InputStream);

                e.Values["ImageWidth"] = uploadedimage.Width.ToString();
                e.Values["ImageHeight"] = uploadedimage.Height.ToString();
                // Make output File Name
                char[] splitter = { '.' };
                string[] splitFile = pathFile.Split(splitter);
                string OutputFilename = splitFile[0] + "s";

                System.Drawing.Image.GetThumbnailImageAbort myCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
                System.Drawing.Image thumbImage = uploadedimage.GetThumbnailImage(74, 54, myCallback, IntPtr.Zero);
                thumbImage.Save(Server.MapPath("../picnic/") + OutputFilename + ".jpg");
                e.Values["Thumbnail"] = "./picnic/" + OutputFilename + ".jpg";
            }
            catch (Exception ex)
            {
                //catch exception here
            }

            e.Values["Pic"] = "./picnic/" + pathFile;
            e.Values["Url"] = "./picnic/" + pathFile;
            e.Values["dateEntered"] = DateTime.Now.ToString();
        }
    }

    public bool ThumbnailCallback()
    {
        return false;
    }
}

Для вставки используются FileUpload и FormView. Затем я использую метод GetThumnailImage () предоставляется в System.Drawing.Imaging. Вы можете ввести любые значения ширины и высоты, и он будет соответственно сжиматься / растягиваться.

uploadedimage.GetThumbnailImage(W, H, myCallback, IntPtr.Zero);

Надеюсь это поможет.

person Sean    schedule 31.10.2008

Загрузка файла изображения выполняется с помощью обратных вызовов клиента ASP.NET 4.0. Если вы не знакомы с обратными вызовами клиентов, я предлагаю вам взглянуть на ASP.Net AJAX Control Toolkit AsyncFileUpload Control без обновления страницы или PostBack на веб-странице ASP.Net или панели обновления ASP.Net AJAX. Обратный вызов запускается, как только файл выбирается пользователем с помощью элемента управления полем файла.

person techshaan    schedule 09.08.2012

person    schedule
comment
Добро пожаловать в stackoverflow и спасибо, что нашли время ответить. Также подумайте о добавлении некоторых пояснений. - person Olivier De Meulder; 09.10.2015

person    schedule
comment
Какая добавленная стоимость по сравнению с другими ответами? - person Adriano Repetti; 29.10.2012