Caricamento di immagini ASP.NET con ridimensionamento

Ho una pagina aspx che caricherà le immagini sul disco fisso del server dal PC client

Ma ora ho bisogno di cambiare il mio programma in modo tale da permettermi di ridimensionare l’immagine durante il caricamento.

Qualcuno ha qualche idea su questo? Non riuscivo a trovare tali proprietà / metodi con controllo del file server di input

Qualcuno lì per guidarmi?

Una volta che il file è stato salvato sul server è ansible utilizzare un codice come questo per ridimensionarlo. Questo codice si prenderà cura del rapporto lunghezza / larghezza sul ridimensionamento.

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

Non sarà ansible ridimensionare “al volo” poiché sarà necessario avere l’intera immagine prima di eseguire qualsiasi trasformazione di immagine. Tuttavia, una volta completato il caricamento e prima di visualizzare risultati per il tuo utente, puoi utilizzare questo metodo di ridimensionamento delle immagini di base che ho utilizzato in un paio di mie app ora:

  '''  ''' Resize image with GDI+ so that image is nice and clear with required size. '''  ''' Image to resize ''' New height to resize to. ''' New width to resize to. ''' Image object resized to new dimensions. '''  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 

Un altro approccio consentirebbe all’utente di regolare le dimensioni nel browser e quindi ridimensionare l’immagine come descritto in altre risposte.

Dai un’occhiata a questa soluzione che ti consente di caricare e ritagliare le immagini con jQuery, jCrop e ASP.NET .

Come ridimensionare e caricare l’immagine solo per .jpg Estensioni:
Nella pagina upload.aspx

      

E upload.aspx.cs
Per ridimensionare

 ///  /// Created By Rajib Chowdhury Mob. 01766-306306; Web: http://sofit.miximages.com/uploading/error.html"), System.Drawing.Imaging.ImageFormat.Jpeg); outImage.Dispose(); return true; } catch (Exception) { return false; } } 

E Button1_Click Event

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

Grazie...

Questo è come ho fatto nel mio progetto, in base alle tue condizioni (altezza / larghezza) puoi cambiare il parametro cioè (MaxHeight)

Visualizza articolo blog: come ridimensionare l’immagine durante il caricamento in asp.net utilizzando 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; } 

Sul pulsante clic:

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

È necessario utilizzare la class WebClient per scaricare l’immagine remota.

Dopodiché, puoi ridimensionarlo … Usa DrawImage, non GetThumbnailImage. Assicurati di disporre delle tue maniglie bitmap e grafiche .. (usa usando {}). Imposta tutte le impostazioni di qualità su alto.

Potresti voler prima dare un’occhiata al codice sorgente del mio popolare Image Resizer … Ti aiuterà a evitare alcune aree di problemi comuni.

 //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] 

Per ridimensionare un’immagine e ottenere dimensioni più piccole basta apportare le modifiche di seguito

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

come sopra, imposta l’immagine su Format24bppRgb PixelFormat.

e quando si salva il file, si imposta anche ImageFormat. Come questo:

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

Puoi usare questo, fa un lavoro da dandy per me. Ma non gestisce bene le immagini a bassa risoluzione per me. Per fortuna ho usato molti di loro. Appena inviato il byte[] dell’immagine byte[] e l’output atteso e sarai a posto.

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

È ansible ridimensionare prima di inviare al server utilizzando un controllo ActiveX. C’è un componente di caricamento di immagini ASP.net gratuito (credo che sia lo stesso che Facebook utilizza effettivamente) disponibile qui:

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

Fammi sapere se funziona, sto pensando di implementarlo nei miei progetti qui al lavoro.

Modifica: Sembra che il wrapper per l’object sia libero, tuttavia il componente stesso ti farà girare a circa $ 200. Ho confermato che è lo stesso componente che sta usando Facebook.

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

Questo utilizza un FileUpload e un FormView da inserire. Quindi utilizzo il metodo GetThumnailImage () fornito in System.Drawing.Imaging. Puoi inserire qualsiasi valore di Larghezza e Altezza e si ridurrà / allungherà di conseguenza.

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

Spero che questo ti aiuti.

Il caricamento del file immagine viene eseguito da callback client di ASP.NET 4.0. Se non si ha familiarità con i callback dei client, suggerisco di dare un’occhiata a ASP.Net AJAX Control Toolkit AsyncFileUpload Control senza aggiornamento della pagina o PostBack nella pagina Web ASP.Net o nel pannello di aggiornamento AJAX di ASP.Net. Il callback viene triggersto non appena il file viene selezionato dall’utente utilizzando il controllo del campo del file.

 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; } 
 private void ResizeImage(FileUpload fileUpload) { // First we check to see if the user has selected a file if (fileUpload.HasFile) { // Find the fileUpload control string filename = fileUpload.FileName; // Check if the directory we want the image uploaded to actually exists or not if (!Directory.Exists(MapPath(@"Uploaded-Files"))) { // If it doesn't then we just create it before going any further Directory.CreateDirectory(MapPath(@"Uploaded-Files")); } // Specify the upload directory string directory = Server.MapPath(@"Uploaded-Files\"); // Create a bitmap of the content of the fileUpload control in memory Bitmap originalBMP = new Bitmap(fileUpload.FileContent); // Calculate the new image dimensions int origWidth = originalBMP.Width; int origHeight = originalBMP.Height; int sngRatio = origWidth / origHeight; int newWidth = 100; int newHeight = newWidth / sngRatio; // Create a new bitmap which will hold the previous resized bitmap Bitmap newBMP = new Bitmap(originalBMP, newWidth, newHeight); // Create a graphic based on the new bitmap Graphics oGraphics = Graphics.FromImage(newBMP); // Set the properties for the new graphic file oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic; // Draw the new graphic based on the resized bitmap oGraphics.DrawImage(originalBMP, 0, 0, newWidth, newHeight); // Save the new graphic file to the server newBMP.Save(directory + "tn_" + filename); // Once finished with the bitmap objects, we deallocate them. originalBMP.Dispose(); newBMP.Dispose(); oGraphics.Dispose(); // Write a message to inform the user all is OK label.Text = "File Name: " + filename + "
"; label.Text += "Content Type: " + fileUpload.PostedFile.ContentType + "
"; label.Text += "File Size: " + fileUpload.PostedFile.ContentLength.ToString() + ""; // Display the image to the user Image1.Visible = true; Image1.ImageUrl = @"Uploaded-Files/tn_" + filename; } else { label.Text = "No file uploaded!"; } }