如何调整图像C#的大小

因为SizeWidthHeightSystem.Drawing.Image Get()属性;
如何在C#中在运行时调整Image对象的大小?

现在,我只是使用以下方法创建一个新的Image

 // objImage is the original Image Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171)); 

这将执行高质量的resize:

 ///  /// Resize the image to the specified width and height. ///  /// The image to resize. /// The width to resize to. /// The height to resize to. /// The resized image. public static Bitmap ResizeImage(Image image, int width, int height) { var destRect = new Rectangle(0, 0, width, height); var destImage = new Bitmap(width, height); destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); using (var graphics = Graphics.FromImage(destImage)) { graphics.CompositingMode = CompositingMode.SourceCopy; graphics.CompositingQuality = CompositingQuality.HighQuality; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; using (var wrapMode = new ImageAttributes()) { wrapMode.SetWrapMode(WrapMode.TileFlipXY); graphics.DrawImage(image, destRect, 0, 0, image.Width,image.Height, GraphicsUnit.Pixel, wrapMode); } } return destImage; } 
  • wrapMode.SetWrapMode(WrapMode.TileFlipXY)可以防止图像边框周围出现重影 – 天真的大小调整会对图像边界之外的透明像素进行采样,但通过镜像图像我们可以获得更好的样本(此设置非常明显)
  • destImage.SetResolution无论物理尺寸如何都能保持DPI – 在缩小图像尺寸或打印时可以提高质量
  • 合成控制像素如何与背景混合 – 可能不需要,因为我们只画了一件事。
    • graphics.CompositingMode确定来自源图像的像素是否覆盖或与背景像素组合。 SourceCopy指定在渲染颜色时,它会覆盖背景颜色。
    • graphics.CompositingQuality确定分层图像的渲染质量级别。
  • graphics.InterpolationMode确定如何计算两个端点之间的中间值
  • graphics.SmoothingMode指定线条,曲线和填充区域的边缘是否使用平滑(也称为抗锯齿) – 可能仅适用于矢量
  • graphics.PixelOffsetMode在绘制新图像时会影响渲染质量

保持纵横比是留给读者的练习(实际上,我只是觉得这个function不是为你做这个function)。

此外, 这是一篇很好的文章,描述了图像大小调整的一些缺陷。 上述function将覆盖其中大部分,但您仍然需要担心保存 。

不确定这有什么困难,做你正在做的事情,使用重载的Bitmap构造函数来创建一个重新resize的图像,你唯一缺少的是回转到Image数据类型:

  public static Image resizeImage(Image imgToResize, Size size) { return (Image)(new Bitmap(imgToResize, size)); } yourImage = resizeImage(yourImage, new Size(50,50)); 

在这个问题上 ,你会有一些答案,包括我的:

 public Image resizeImage(int newWidth, int newHeight, string stPhotoPath) { Image imgPhoto = Image.FromFile(stPhotoPath); int sourceWidth = imgPhoto.Width; int sourceHeight = imgPhoto.Height; //Consider vertical pics if (sourceWidth < sourceHeight) { int buff = newWidth; newWidth = newHeight; newHeight = buff; } int sourceX = 0, sourceY = 0, destX = 0, destY = 0; float nPercent = 0, nPercentW = 0, nPercentH = 0; nPercentW = ((float)newWidth / (float)sourceWidth); nPercentH = ((float)newHeight / (float)sourceHeight); if (nPercentH < nPercentW) { nPercent = nPercentH; destX = System.Convert.ToInt16((newWidth - (sourceWidth * nPercent)) / 2); } else { nPercent = nPercentW; destY = System.Convert.ToInt16((newHeight - (sourceHeight * nPercent)) / 2); } int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap bmPhoto = new Bitmap(newWidth, newHeight, PixelFormat.Format24bppRgb); bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); Graphics grPhoto = Graphics.FromImage(bmPhoto); grPhoto.Clear(Color.Black); grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; grPhoto.DrawImage(imgPhoto, new Rectangle(destX, destY, destWidth, destHeight), new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel); grPhoto.Dispose(); imgPhoto.Dispose(); return bmPhoto; } 

为什么不使用System.Drawing.Image.GetThumbnailImage方法?

 public Image GetThumbnailImage( int thumbWidth, int thumbHeight, Image.GetThumbnailImageAbort callback, IntPtr callbackData) 

例:

 Image originalImage = System.Drawing.Image.FromStream(inputStream, true, true); Image resizedImage = originalImage.GetThumbnailImage(newWidth, (newWidth * originalImage.Height) / originalWidth, null, IntPtr.Zero); resizedImage.Save(imagePath, ImageFormat.Png); 

来源: http : //msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx

这将 –

  • 调整宽度和高度,无需循环
  • 不超过图像原始尺寸

//////////////

 private void ResizeImage(Image img, double maxWidth, double maxHeight) { double resizeWidth = img.Source.Width; double resizeHeight = img.Source.Height; 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; } 
 public static Image resizeImage(Image image, int new_height, int new_width) { Bitmap new_image = new Bitmap(new_width, new_height); Graphics g = Graphics.FromImage((Image)new_image ); g.InterpolationMode = InterpolationMode.High; g.DrawImage(image, 0, 0, new_width, new_height); return new_image; } 

在我做的应用程序中,有必要创建一个具有多个选项的函数。 它非常大,但它可以调整图像大小,可以保持纵横比并可以剪切边缘以仅返回图像的中心:

 ///  /// Resize image with a directory as source ///  /// Image location /// new height /// new width /// keep the aspect ratio /// return the center bit of the image /// image with new dimentions public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio, Boolean getCenter) { int newheigth = heigth; System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFileLocation); // Prevent using images internal thumbnail FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone); if (keepAspectRatio || getCenter) { int bmpY = 0; double resize = (double)FullsizeImage.Width / (double)width;//get the resize vector if (getCenter) { bmpY = (int)((FullsizeImage.Height - (heigth * resize)) / 2);// gives the Y value of the part that will be cut off, to show only the part in the center Rectangle section = new Rectangle(new Point(0, bmpY), new Size(FullsizeImage.Width, (int)(heigth * resize)));// create the section to cut of the original image //System.Console.WriteLine("the section that will be cut off: " + section.Size.ToString() + " the Y value is minimized by: " + bmpY); Bitmap orImg = new Bitmap((Bitmap)FullsizeImage);//for the correct effect convert image to bitmap. FullsizeImage.Dispose();//clear the original image using (Bitmap tempImg = new Bitmap(section.Width, section.Height)) { Graphics cutImg = Graphics.FromImage(tempImg);// set the file to save the new image to. cutImg.DrawImage(orImg, 0, 0, section, GraphicsUnit.Pixel);// cut the image and save it to tempImg FullsizeImage = tempImg;//save the tempImg as FullsizeImage for resizing later orImg.Dispose(); cutImg.Dispose(); return FullsizeImage.GetThumbnailImage(width, heigth, null, IntPtr.Zero); } } else newheigth = (int)(FullsizeImage.Height / resize);// set the new heigth of the current image }//return the image resized to the given heigth and width return FullsizeImage.GetThumbnailImage(width, newheigth, null, IntPtr.Zero); } 

为了更容易访问该函数,可以添加一些重载函数:

 ///  /// Resize image with a directory as source ///  /// Image location /// new height /// new width /// image with new dimentions public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width) { return resizeImageFromFile(OriginalFileLocation, heigth, width, false, false); } ///  /// Resize image with a directory as source ///  /// Image location /// new height /// new width /// keep the aspect ratio /// image with new dimentions public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio) { return resizeImageFromFile(OriginalFileLocation, heigth, width, keepAspectRatio, false); } 

现在是可选的最后两个布尔值。 像这样调用函数:

 System.Drawing.Image ResizedImage = resizeImageFromFile(imageLocation, 800, 400, true, true); 
 public string CreateThumbnail(int maxWidth, int maxHeight, string path) { var image = System.Drawing.Image.FromFile(path); var ratioX = (double)maxWidth / image.Width; var ratioY = (double)maxHeight / image.Height; var ratio = Math.Min(ratioX, ratioY); var newWidth = (int)(image.Width * ratio); var newHeight = (int)(image.Height * ratio); var newImage = new Bitmap(newWidth, newHeight); Graphics thumbGraph = Graphics.FromImage(newImage); thumbGraph.CompositingQuality = CompositingQuality.HighQuality; thumbGraph.SmoothingMode = SmoothingMode.HighQuality; //thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic; thumbGraph.DrawImage(image, 0, 0, newWidth, newHeight); image.Dispose(); string fileRelativePath = "newsizeimages/" + maxWidth + Path.GetFileName(path); newImage.Save(Server.MapPath(fileRelativePath), newImage.RawFormat); return fileRelativePath; } 

点击这里http://bhupendrasinghsaini.blogspot.in/2014/07/resize-image-in-c.html

这是我为特定要求制定的代码,即:目的地始终是横向比率。 它应该给你一个良好的开端。

 public Image ResizeImage(Image source, RectangleF destinationBounds) { RectangleF sourceBounds = new RectangleF(0.0f,0.0f,(float)source.Width, (float)source.Height); RectangleF scaleBounds = new RectangleF(); Image destinationImage = new Bitmap((int)destinationBounds.Width, (int)destinationBounds.Height); Graphics graph = Graphics.FromImage(destinationImage); graph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; // Fill with background color graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), destinationBounds); float resizeRatio, sourceRatio; float scaleWidth, scaleHeight; sourceRatio = (float)source.Width / (float)source.Height; if (sourceRatio >= 1.0f) { //landscape resizeRatio = destinationBounds.Width / sourceBounds.Width; scaleWidth = destinationBounds.Width; scaleHeight = sourceBounds.Height * resizeRatio; float trimValue = destinationBounds.Height - scaleHeight; graph.DrawImage(source, 0, (trimValue / 2), destinationBounds.Width, scaleHeight); } else { //portrait resizeRatio = destinationBounds.Height/sourceBounds.Height; scaleWidth = sourceBounds.Width * resizeRatio; scaleHeight = destinationBounds.Height; float trimValue = destinationBounds.Width - scaleWidth; graph.DrawImage(source, (trimValue / 2), 0, scaleWidth, destinationBounds.Height); } return destinationImage; } 

此代码与从上述答案之一发布相同..但将透明像素转换为白色而不是黑色…谢谢:)

  public Image resizeImage(int newWidth, int newHeight, string stPhotoPath) { Image imgPhoto = Image.FromFile(stPhotoPath); int sourceWidth = imgPhoto.Width; int sourceHeight = imgPhoto.Height; //Consider vertical pics if (sourceWidth < sourceHeight) { int buff = newWidth; newWidth = newHeight; newHeight = buff; } int sourceX = 0, sourceY = 0, destX = 0, destY = 0; float nPercent = 0, nPercentW = 0, nPercentH = 0; nPercentW = ((float)newWidth / (float)sourceWidth); nPercentH = ((float)newHeight / (float)sourceHeight); if (nPercentH < nPercentW) { nPercent = nPercentH; destX = System.Convert.ToInt16((newWidth - (sourceWidth * nPercent)) / 2); } else { nPercent = nPercentW; destY = System.Convert.ToInt16((newHeight - (sourceHeight * nPercent)) / 2); } int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap bmPhoto = new Bitmap(newWidth, newHeight, PixelFormat.Format24bppRgb); bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution); Graphics grPhoto = Graphics.FromImage(bmPhoto); grPhoto.Clear(Color.White); grPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; grPhoto.DrawImage(imgPhoto, new Rectangle(destX, destY, destWidth, destHeight), new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), GraphicsUnit.Pixel); grPhoto.Dispose(); imgPhoto.Dispose(); return bmPhoto; } 

如果您正在使用BitmapSource

 var resizedBitmap = new TransformedBitmap( bitmapSource, new ScaleTransform(scaleX, scaleY)); 

如果您想要更好地控制质量,请先运行:

 RenderOptions.SetBitmapScalingMode( bitmapSource, BitmapScalingMode.HighQuality); 

(默认为BitmapScalingMode.Linear ,相当于BitmapScalingMode.LowQuality 。)

我使用ImageProcessorCore,主要是因为它运行.Net Core。

它有更多选项,如转换类型,裁剪图像等

http://imageprocessor.org/imageprocessor/

您可以使用Accord.NET框架 。 它提供了一些不同的resize的方法:

  • 双立方
  • 双线性
  • 最近邻

注意:这不适用于ASP.Net Core,因为WebImage依赖于System.Web,但在以前版本的ASP.Net上,我多次使用此代码片段并且非常有用。

 String ThumbfullPath = Path.GetFileNameWithoutExtension(file.FileName) + "80x80.jpg"; var ThumbfullPath2 = Path.Combine(ThumbfullPath, fileThumb); using (MemoryStream stream = new MemoryStream(System.IO.File.ReadAllBytes(fullPath))) { var thumbnail = new WebImage(stream).Resize(80, 80); thumbnail.Save(ThumbfullPath2, "jpg"); } 

resize并保存图像以适应宽度和高度,就像canvas保持图像成比例一样

 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; namespace Infra.Files { public static class GenerateThumb { ///  /// Resize and save an image to fit under width and height like a canvas keeping things proportional ///  ///  ///  ///  ///  public static void GenerateThumbImage(string originalImagePath, string thumbImagePath, int newWidth, int newHeight) { Bitmap srcBmp = new Bitmap(originalImagePath); float ratio = 1; float minSize = Math.Min(newHeight, newHeight); if (srcBmp.Width > srcBmp.Height) { ratio = minSize / (float)srcBmp.Width; } else { ratio = minSize / (float)srcBmp.Height; } SizeF newSize = new SizeF(srcBmp.Width * ratio, srcBmp.Height * ratio); Bitmap target = new Bitmap((int)newSize.Width, (int)newSize.Height); using (Graphics graphics = Graphics.FromImage(target)) { graphics.CompositingQuality = CompositingQuality.HighSpeed; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.CompositingMode = CompositingMode.SourceCopy; graphics.DrawImage(srcBmp, 0, 0, newSize.Width, newSize.Height); using (MemoryStream memoryStream = new MemoryStream()) { target.Save(thumbImagePath); } } } } } 

使用波纹管function和波纹管示例更改图像尺寸:

 //Example : System.Net.Mime.MediaTypeNames.Image newImage = System.Net.Mime.MediaTypeNames.Image.FromFile("SampImag.jpg"); System.Net.Mime.MediaTypeNames.Image temImag = FormatImage(newImage, 100, 100); //image size modification unction public static System.Net.Mime.MediaTypeNames.Image FormatImage(System.Net.Mime.MediaTypeNames.Image img, int outputWidth, int outputHeight) { Bitmap outputImage = null; Graphics graphics = null; try { outputImage = new Bitmap(outputWidth, outputHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555); graphics = Graphics.FromImage(outputImage); graphics.DrawImage(img, new Rectangle(0, 0, outputWidth, outputHeight), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel); return outputImage; } catch (Exception ex) { return img; } } 

我在我的项目中使用此代码,它工作正常

 var ms = new MemoryStream(File.ReadAllBytes(Source)); Bitmap objBitmap = new Bitmap(ms); if (size.Height == 0) { size = objBitmap.Size; } objBitmap = new Bitmap(objBitmap, size); objBitmap.Save(Destination);