66

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

我有很多解决方案,但似乎没有一个能真正满足我的需求;它们围绕基于保持宽度或高度相同但不改变两者的缩放。

一个例子:

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

我该如何处理大于所需尺寸且小于所需尺寸的图像,以及在缩放后无法达到我需要的确切尺寸的填充图像?

4

3 回答 3

184

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

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

如果您想控制插值模式,请参阅这篇文章

于 2013-10-24T11:57:30.630 回答
63

目标参数:

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)保存生成的文件。

于 2012-05-04T08:12:41.797 回答
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;
}
于 2018-03-20T23:33:37.930 回答