Carga de imágenes ASP.NET con cambio de tamaño

Tengo una página aspx que cargará imágenes al disco duro del servidor desde la PC del cliente

Pero ahora tengo que cambiar mi progtwig de tal manera que me permita cambiar el tamaño de la imagen durante la carga.

¿Alguien tiene alguna idea sobre esto? No pude encontrar tales propiedades / métodos con el control del servidor de archivos de entrada

¿Hay alguien allí para guiarme?

Una vez que el archivo se haya guardado en el servidor, puede usar un código como este para cambiar el tamaño. Este código se ocupará de la relación longitud / ancho en el cambio de tamaño.

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

No podrá cambiar el tamaño “sobre la marcha” ya que tendrá que tener la imagen completa antes de realizar cualquier transformación de imagen. Sin embargo, una vez completada la carga y antes de mostrar los resultados a su usuario, puede utilizar este método básico de redimensionamiento de la imagen que he usado en algunas de mis aplicaciones ahora:

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

Otro enfoque permitiría al usuario ajustar el tamaño en el navegador y luego cambiar el tamaño de la imagen como se describe en otras respuestas.

Así que eche un vistazo a esta solución que le permite cargar y recortar imágenes con jQuery, jCrop y ASP.NET .

Cómo cambiar el tamaño y subir la imagen solo para .jpg Extensiones:
En la página upload.aspx

      

Y upload.aspx.cs
Para cambiar el tamaño

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

Y el evento 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 } } } 

Gracias...

Así es como lo hice en mi proyecto, basado en su condición (altura / ancho) puede cambiar el parámetro, es decir (MaxHeight)

Ver el artículo del blog: Cómo cambiar el tamaño de la imagen durante la carga en asp.net usando 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; } 

Al hacer clic en el botón:

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

Tendrá que usar la clase de WebClient para descargar la imagen remota.

Después de eso, puedes redimensionarlo … Usa DrawImage, no GetThumbnailImage. Asegúrese de deshacerse de su bitmap y de sus manejadores gráficos … (use usando {}). Establezca todas las configuraciones de calidad en alto.

Es posible que primero desee examinar el código fuente de mi popular redimensionador de imágenes … Lo ayudará a evitar algunas áreas problemáticas comunes.

 //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 izacmail@gmail.com 

Para cambiar el tamaño de una imagen y obtener tamaños más pequeños, solo realice los cambios a continuación

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

como arriba, configure la imagen en Format24bppRgb PixelFormat.

y cuando guardas el archivo, configuras el ImageFormat también. Me gusta esto:

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

Puedes usar esto, hace un excelente trabajo para mí. Pero no maneja bien las imágenes de baja resolución para mí. Afortunadamente, estoy acostumbrado a muchos de ellos. Solo le envié el byte[] imagen byte[] y el resultado esperado, y estará listo para continuar.

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

Podría cambiar el tamaño antes de enviarlo al servidor usando un control ActiveX. Hay un componente gratuito de carga de imágenes ASP.net (creo que este es el mismo que Facebook usa en realidad) disponible aquí:

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

Avíseme si funciona, estoy pensando en implementarlo en mis proyectos aquí en el trabajo.

Editar: parece que el contenedor para el objeto es gratuito, sin embargo, el componente real en sí mismo le costará unos $ 200. Confirmé que es el mismo componente que usa 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; } } 

Esto usa FileUpload y FormView para insertar. Luego utilizo el método GetThumnailImage () provisto en System.Drawing.Imaging. Puede ingresar cualquier valor de Ancho y Alto y se encogerá / estirará en consecuencia.

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

Espero que esto ayude.

La carga del archivo de imagen se realiza mediante las devoluciones de llamada de cliente de ASP.NET 4.0. Si no está familiarizado con las devoluciones de llamadas de los clientes, le sugiero que consulte el ASP.Net AJAX Control Toolkit AsyncFileUpload Control sin actualizar la página o PostBack en la página web ASP.Net o ASP.Net AJAX Update Panel. La callback se activa tan pronto como el usuario selecciona el archivo usando el control de campo de archivo.

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