在c#中从memorystream保存为jpeg

我有一个如下所示的方法将图像保存为jpeg。 我希望保存所有具有相同高度和宽度的图片,而不会失真。

我怎样才能做到这一点? 请帮忙

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

调整图像大小并保存

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

您可以使用此代码将图像调整为所需的尺寸在保存之前

正如其他人所提到的,如果您希望所有图像都具有相同的大小而不会失真,那么您需要在保持纵横比的同时resize。 看下面的这个function:

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

现在您的使用function可以大大简化(假设这里有1024×768目标图像):

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

请注意,在变量数量方面增加了简化,并使用using而不是Dispose()进行Dispose()