Salvataggio come jpeg da memorystream in c #

Ho un metodo come mostrato di seguito per salvare l’immagine come jpeg. Voglio salvare tutte le immagini con la stessa altezza e larghezza senza che si distorca.

Come lo posso fare? Per favore aiuto

public void SaveFileOnDisk(MemoryStream ms, string FileName) { try { string appPath = HttpContext.Current.Request.ApplicationPath; string physicalPath = HttpContext.Current.Request.MapPath(appPath); string strpath = physicalPath + "\\Images"; string WorkingDirectory = strpath; System.Drawing.Image imgSave = System.Drawing.Image.FromStream(ms); Bitmap bmSave = new Bitmap(imgSave); Bitmap bmTemp = new Bitmap(bmSave); Graphics grSave = Graphics.FromImage(bmTemp); grSave.DrawImage(imgSave, 0, 0, imgSave.Width, imgSave.Height); bmTemp.Save(WorkingDirectory + "\\" + FileName + ".jpg"); imgSave.Dispose(); bmSave.Dispose(); bmTemp.Dispose(); grSave.Dispose(); } catch (Exception ex) { //lblMsg.Text = "Please try again later."; } } 

Ridimensiona l’immagine e salvala

 Private void ResizeImage(Image img, double maxWidth, double maxHeight) { double srcWidth = img.Source.Width; double srcHeight = img.Source.Height; double resizeWidth = srcWidth; double resizeHeight = srcHeight; double aspect = resizeWidth / resizeHeight; if (resizeWidth > maxWidth) { resizeWidth = maxWidth; resizeHeight = resizeWidth / aspect; } if (resizeHeight > maxHeight) { aspect = resizeWidth / resizeHeight; resizeHeight = maxHeight; resizeWidth = resizeHeight * aspect; } img.Width = resizeWidth; img.Height = resizeHeight; } 

È ansible utilizzare questo codice per ridimensionare l’immagine sulla Dimention richiesta prima di salvarla

Come altri hanno già detto, se si desidera che tutte le immagini abbiano la stessa dimensione senza distorsioni, è necessario ridimensionare mantenendo le proporzioni. Vedi questa funzione qui sotto:

 public Image ResizeWithSameRatio(Image image, float width, float height) { // the colour for letter boxing, can be a parameter var brush = new SolidBrush(Color.Black); // target scaling factor float scale = Math.Min(width / image.Width, height / image.Height); // target image var bmp = new Bitmap((int)width, (int)height); var graph = Graphics.FromImage(bmp); var scaleWidth = (int)(image.Width * scale); var scaleHeight = (int)(image.Height * scale); // fill the background and then draw the image in the 'centre' graph.FillRectangle(brush, new RectangleF(0, 0, width, height)); graph.DrawImage(image, new Rectangle(((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight)); return bmp; } 

Ora la tua funzione di utilizzo può essere notevolmente semplificata (supponendo che le immagini di destinazione 1024×768 siano qui):

 public void SaveFileOnDisk(MemoryStream ms, string FileName) { try { string appPath = HttpContext.Current.Request.ApplicationPath; string physicalPath = HttpContext.Current.Request.MapPath(appPath); string strpath = physicalPath + "\\Images"; string WorkingDirectory = strpath; using (var original = Image.FromStream(ms)) using (var resized = ResizeWithSameRatio(original, 1024, 768)) { resized.Save(WorkingDirectory + "\\" + FileName + ".jpg"); } } catch (Exception ex) { //lblMsg.Text = "Please try again later."; } } 

Notare la semplificazione aggiunta in termini di numero di variabili e smaltimento utilizzando using invece di Dispose() .