将System.Drawing.Bitmap缩放到给定大小,同时保持纵横比

Mic*_*ray 50 c# graphics imaging

我想将a缩放System.Drawing.Bitmap到至少小于某个固定的宽度和高度.这是为网站上的图库创建缩略图,所以我想保持纵横比相同.

我有一些解决方案,但似乎没有一个真正做我需要的; 它们围绕着基于保持宽度或高度相同但不改变两者的缩放而展开.

一个例子:

如果我有一个4272 x 2848图像,并且我想将其缩放到1024 x 768的大小,那么生成的图像应该是1024 x 683并填充(带黑色边框)到1024 x 768.

如何处理大于所需尺寸且小于要求尺寸的图像,以及填充图像,这些图像在缩放后不会达到我需要的确切尺寸?

WHo*_*Hol 138

位图构造函数已内置调整大小.

Bitmap original = (Bitmap)Image.FromFile("DSC_0002.jpg");
Bitmap resized = new Bitmap(original,new Size(original.Width/4,original.Height/4));
resized.Save("DSC_0002_thumb.jpg");
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/0wh0045z.aspx

如果要控制插值模式,请参阅此文章.

  • *这不只是在新的较小位图中绘制原始位图吗?*TFM的链接就在那里:*从指定的现有图像初始化Bitmap类的新实例,**缩放到指定的大小**.* (3认同)
  • 谢谢.这有很大帮助.我知道这是一个古老的答案,但是有一个原因让我的新图像模糊不清吗?我需要设置任何插值模式吗? (2认同)
  • 这不是只是在新的较小位图中绘制原始位图吗?图像的一部分应该被剪切掉. (2认同)

yam*_*men 53

目标参数:

float width = 1024;
float height = 768;
var brush = new SolidBrush(Color.Black);
Run Code Online (Sandbox Code Playgroud)

你原来的档案:

var image = new Bitmap(file);
Run Code Online (Sandbox Code Playgroud)

目标尺寸(比例因子):

float scale = Math.Min(width / image.Width, height / image.Height);
Run Code Online (Sandbox Code Playgroud)

调整大小包括首先刷涂画布:

var bmp = new Bitmap((int)width, (int)height);
var graph = Graphics.FromImage(bmp);

// uncomment for higher quality output
//graph.InterpolationMode = InterpolationMode.High;
//graph.CompositingQuality = CompositingQuality.HighQuality;
//graph.SmoothingMode = SmoothingMode.AntiAlias;

var scaleWidth = (int)(image.Width * scale);
var scaleHeight = (int)(image.Height * scale);

graph.FillRectangle(brush, new RectangleF(0, 0, width, height));
graph.DrawImage(image, ((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight);
Run Code Online (Sandbox Code Playgroud)

并且不要忘记执行a bmp.Save(filename)保存生成的文件.

  • 我知道这是旧的,但这对我有所帮助,所以谢谢.但是,我在一个使用块中包装**图**,因为它实现了IDisposable. (9认同)
  • 将`var scale`更改为`float scale`.我猜你的代码中的某个地方你的`width`和`height`可能被声明为`int`,这会导致问题.如果你按照我的密切关注,它就可以正常工作.`scale`的重点是保持纵横比.完成后删除-1. (4认同)
  • 这将创建一个纯黑色图像。 (3认同)
  • 我觉得这也很老了,但是我提到Graphics是Disposable(),所以不要忘记把那个图形对象放到using语句中 (2认同)
  • 是否有一个特定的原因使用`FillRectangle`方法而不是`Clear`方法?这将节省必须创建画笔并进行处理. (2认同)