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

时间:2012-05-04 03:22:42

标签: c# graphics imaging

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

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

一个例子:

如果我有4272 x 2848图像并且我想将其缩放到1024 x 768的尺寸,则生成的图像应为1024 x 683并填充(带黑色边框)至1024 x 768。

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

3 个答案:

答案 0 :(得分:131)

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

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");

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

如果要控制插值模式,请参阅this post

答案 1 :(得分:51)

目标参数:

float width = 1024;
float height = 768;
var brush = new SolidBrush(Color.Black);

您的原始文件:

var image = new Bitmap(file);

目标尺寸(比例因子):

float scale = Math.Min(width / image.Width, height / image.Height);

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

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

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

答案 2 :(得分:2)

只是添加到yamen的答案,这对于图像来说是完美的,但对文本来说并不是那么多。 如果您正在尝试使用它来缩放文本...就像说word文档(在这种情况下,从word interop中以字节为单位),您将需要进行一些修改,否则您将获得巨大的条形。 可能不完美但对我有用!

using (MemoryStream ms = new MemoryStream(wordBytes))
                {
                    float width = 3840;
                    float height = 2160;

                    var brush = new SolidBrush(Color.White);
                    var rawImage = Image.FromStream(ms);
                    float scale = Math.Min(width / rawImage.Width, height / rawImage.Height);
                    var scaleWidth = (int)(rawImage.Width * scale);
                    var scaleHeight = (int)(rawImage.Height * scale);
                    var scaledBitmap = new Bitmap(scaleWidth, scaleHeight);
                    Graphics graph = Graphics.FromImage(scaledBitmap);
                    graph.InterpolationMode = InterpolationMode.High;
                    graph.CompositingQuality = CompositingQuality.HighQuality;
                    graph.SmoothingMode = SmoothingMode.AntiAlias;
                    graph.FillRectangle(brush, new RectangleF(0, 0, width, height));
                    graph.DrawImage(rawImage, new Rectangle(0, 0 , scaleWidth, scaleHeight));
                    scaledBitmap.Save(fileName, ImageFormat.Png);
                    return scaledBitmap;
                }