Size, Width和Height都是System.Drawing.Image的Get()属性; 我如何在c#运行时调整图像对象的大小?
现在,我只是创建一个新的图像使用:
// objImage is the original Image
Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171));
Size, Width和Height都是System.Drawing.Image的Get()属性; 我如何在c#运行时调整图像对象的大小?
现在,我只是创建一个新的图像使用:
// objImage is the original Image
Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171));
当前回答
调整大小并保存图像以适应宽度和高度,就像画布保持图像成比例
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
namespace Infra.Files
{
public static class GenerateThumb
{
/// <summary>
/// Resize and save an image to fit under width and height like a canvas keeping things proportional
/// </summary>
/// <param name="originalImagePath"></param>
/// <param name="thumbImagePath"></param>
/// <param name="newWidth"></param>
/// <param name="newHeight"></param>
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);
}
}
}
}
}
其他回答
注意:这将不适用于ASP。因为WebImage依赖于系统。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");
}
如果你正在使用BitmapSource:
var resizedBitmap = new TransformedBitmap(
bitmapSource,
new ScaleTransform(scaleX, scaleY));
如果你想要更好的控制质量,首先运行这个:
RenderOptions.SetBitmapScalingMode(
bitmapSource,
BitmapScalingMode.HighQuality);
(默认为BitmapScalingMode。线性,相当于BitmapScalingMode.LowQuality。)
你可以试试net-vips, libvips的c#绑定。它是一个懒惰的、流的、需求驱动的图像处理库,所以它可以做这样的操作,而不需要加载整个图像。
例如,它附带了一个方便的图像缩略图:
using Image image = Image.Thumbnail("image.jpg", 300, 300);
image.WriteToFile("my-thumbnail.jpg");
它还支持智能裁剪,这是一种智能确定图像中最重要的部分并在裁剪图像时保持对焦的方法。例如:
using Image image = Image.Thumbnail("owl.jpg", 128, crop: Enums.Interesting.Attention);
image.WriteToFile("tn_owl.jpg");
其中owl.jpg是一个偏离中心的合成:
给出如下结果:
首先,它将图像的垂直轴缩小到128像素,然后使用注意力策略将图像缩小到128像素。这一个搜索图像中可能吸引人眼的特征,详见Smartcrop()。
为什么不用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
这将执行高质量的调整大小:
/// <summary>
/// Resize the image to the specified width and height.
/// </summary>
/// <param name="image">The image to resize.</param>
/// <param name="width">The width to resize to.</param>
/// <param name="height">The height to resize to.</param>
/// <returns>The resized image.</returns>
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) prevents ghosting around the image borders -- naïve resizing will sample transparent pixels beyond the image boundaries, but by mirroring the image we can get a better sample (this setting is very noticeable) destImage.SetResolution maintains DPI regardless of physical size -- may increase quality when reducing image dimensions or when printing Compositing controls how pixels are blended with the background -- might not be needed since we're only drawing one thing. graphics.CompositingMode determines whether pixels from a source image overwrite or are combined with background pixels. SourceCopy specifies that when a color is rendered, it overwrites the background color. graphics.CompositingQuality determines the rendering quality level of layered images. graphics.InterpolationMode determines how intermediate values between two endpoints are calculated graphics.SmoothingMode specifies whether lines, curves, and the edges of filled areas use smoothing (also called antialiasing) -- probably only works on vectors graphics.PixelOffsetMode affects rendering quality when drawing the new image
保持纵横比是留给读者的练习(实际上,我只是不认为这个函数的工作是为您做这件事)。
此外,这是一篇很好的文章,描述了调整图像大小的一些陷阱。上面的函数将涵盖其中的大部分,但您仍然需要担心保存。