web-dev-qa-db-fra.com

Téléchargement d'images ASP.NET avec redimensionnement

J'ai une page aspx qui téléchargera des images sur le disque dur du serveur à partir du PC client

Mais maintenant, je dois changer mon programme de telle manière qu'il me permette de redimensionner l'image lors du téléchargement.

Quelqu'un a-t-il une idée à ce sujet? Je ne pouvais pas trouver de telles propriétés/méthodes avec le contrôle du serveur de fichiers d'entrée

Quelqu'un est là pour me guider?

34
user29982

Une fois le fichier enregistré sur le serveur, vous pouvez utiliser un code comme celui-ci pour redimensionner. Ce code prendra en charge le rapport longueur/largeur lors du redimensionnement.

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;
}
15
JPrescottSanders

Vous ne serez pas en mesure de redimensionner "à la volée" car vous devrez disposer de l'image complète avant d'effectuer toute transformation d'image. Cependant, une fois le téléchargement terminé et avant d'afficher les résultats à votre utilisateur, vous pouvez utiliser cette méthode de redimensionnement d'image de base que j'ai utilisée dans quelques-unes de mes applications:

   ''' <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
5
Dillie-O

Une autre approche consisterait à permettre à l'utilisateur d'ajuster la taille dans le navigateur, puis de redimensionner l'image comme décrit dans d'autres réponses.

Jetez donc un œil à cette solution qui vous permet de télécharger et recadrer des images avec jQuery, jCrop & ASP.NET .

4
Naeem Sarfraz

Comment redimensionner et télécharger l'image uniquement pour les extensions .jpg:
Dans la page 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." />

Et upload.aspx.cs
Pour redimensionner

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

Et événement 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
                }
            }
        }

Merci...

4
RKTUXYN

Voici comment je l'ai fait dans mon projet, en fonction de votre condition (hauteur/largeur) vous pouvez changer le paramètre ie (MaxHeight)

Voir l'article du blog: Comment redimensionner l'image lors du téléchargement dans asp.net à l'aide de c #

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

Sur le clic du bouton:

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");
       }
   }
 }
3
Satinder singh

Vous devrez utiliser la classe WebClient pour télécharger l'image distante.

Après cela, vous pouvez le redimensionner ... Utilisez DrawImage, pas GetThumbnailImage. Assurez-vous de disposer de vos poignées bitmap et graphiques .. (utilisez en utilisant {}). Réglez tous les paramètres de qualité sur élevé.

Vous voudrez peut-être jeter un œil au code source de mon redimensionneur d'image populaire d'abord ... Cela vous aidera à éviter certaines zones de problèmes courantes.

2
Nathanael Jones

Pour redimensionner une image et obtenir des tailles plus petites, effectuez simplement les modifications ci-dessous

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

     Graphics g = Graphics.FromImage(bmpOut);

comme ci-dessus, définissez l'imagem sur Format24bppRgb PixelFormat.

et lorsque vous enregistrez le fichier, vous définissez également l'ImageFormat. Comme ça:

bmpOut.Save(PathImage, System.Drawing.Imaging.ImageFormat.Jpeg);
1
Pedro Souki

Vous pouvez l'utiliser, cela fait un travail dandy pour moi. Mais il ne gère pas bien les images basse résolution pour moi. Heureusement, j'en utilise beaucoup. Je viens de lui envoyer l'image byte[] et la sortie attendue et vous serez prêt à partir.

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; 
} 
1
Tim Meers
//Here is another WAY fox!!! i have actually modify the code from You all. HIHI
//First, add one textBox and one FileUpload Control, and a button

//paste this in your code behind file... after public partial class admin : System.Web.UI.Page

    string OriPath;
    string ImageName;

public Size NewImageSize(int OriginalHeight, int OriginalWidth, double FormatSize)
    {
        Size NewSize;
        double tempval;

        if (OriginalHeight > FormatSize && OriginalWidth > FormatSize)
        {
            if (OriginalHeight > OriginalWidth)
                tempval = FormatSize / Convert.ToDouble(OriginalHeight);
            else
                tempval = FormatSize / Convert.ToDouble(OriginalWidth);

            NewSize = new Size(Convert.ToInt32(tempval * OriginalWidth), Convert.ToInt32(tempval * OriginalHeight));
        }
        else
            NewSize = new Size(OriginalWidth, OriginalHeight); return NewSize;
    } 



//Now, On Button click add the folwing code.

if (FileUpload1.PostedFile != null)
        {
           ImageName = TextBox1.Text+".jpg";


           OriPath = Server.MapPath("pix\\") + ImageName;

           //Gets the Full Path using Filecontrol1 which points to actual location in the hardisk :)

           using (System.Drawing.Image Img = System.Drawing.Image.FromFile(System.IO.Path.GetFullPath(FileUpload1.PostedFile.FileName)))
           {
               Size ThumbNailSize = NewImageSize(Img.Height, Img.Width, 800);

               using (System.Drawing.Image ImgThnail = new Bitmap(Img, ThumbNailSize.Width, ThumbNailSize.Height))
               {
                   ImgThnail.Save(OriPath, Img.RawFormat);
                   ImgThnail.Dispose();
               }
               Img.Dispose();
           }
}


//Enjoy. If any problem,, mail me at [email protected] 
1
isaac
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;
    }
}

Cela utilise un FileUpload et un FormView pour insérer. Ensuite, j'utilise la méthode GetThumnailImage () fournie dans System.Drawing.Imaging. Vous pouvez saisir n'importe quelle valeur de largeur et de hauteur et elle rétrécira/s'étirera en conséquence.

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

J'espère que cela t'aides.

0
Sean

Vous pouvez redimensionner avant d'envoyer au serveur à l'aide d'un contrôle ActiveX. Il y a un composant gratuit de téléchargement d'images ASP.net (je pense que c'est le même que celui que Facebook utilise réellement) disponible ici:

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

Faites-moi savoir si cela fonctionne, je pense à l'implémenter dans mes projets ici au travail.

Edit: On dirait que le wrapper de l'objet est gratuit, mais le composant lui-même va vous coûter environ 200 $. J'ai confirmé que c'est le même composant que Facebook utilise.

0
Kyle Ballard

Le téléchargement du fichier image est effectué par les rappels clients ASP.NET 4.0. Si vous n'êtes pas familier avec les rappels clients, je vous suggère de jeter un œil à ASP.Net AJAX Control Toolkit AsyncFileUpload Control sans actualisation de page ou PostBack dans la page Web ASP.Net ou ASP.Net = AJAX Update Panel. Le rappel est déclenché dès que le fichier est sélectionné par l'utilisateur à l'aide du contrôle de champ de fichier.

0
techshaan
public string ResizeImageAndSave(int Width, int Height, string imageUrl, string destPath)
    {
        System.Drawing.Image fullSizeImg = System.Drawing.Image.FromFile(imageUrl);
 double widthRatio = (double)fullSizeImg.Width / (double)Width;
  double heightRatio = (double)fullSizeImg.Height / (double)Height;
  double ratio = Math.Max(widthRatio, heightRatio);
 int newWidth = (int)(fullSizeImg.Width / ratio);
 int newHeight = (int)(fullSizeImg.Height / ratio);
        //System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
        System.Drawing.Image thumbNailImg = fullSizeImg.GetThumbnailImage(newWidth, newHeight, new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback), IntPtr.Zero);
 //DateTime MyDate = DateTime.Now;
 //String MyString = MyDate.ToString("ddMMyyhhmmss") + imageUrl.Substring(imageUrl.LastIndexOf("."));
 thumbNailImg.Save(destPath, ImageFormat.Jpeg);
 thumbNailImg.Dispose();
        return "";
    }
    public bool ThumbnailCallback() { return false; }
0
Loai Tayem