2012-05-04 496 views
36

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

我有一些不同的解决方案,但似乎没有真正做我需要的;他们围绕缩放进行旋转,基于保持宽度或高度相同但不改变两者。

一个例子:

如果我有一个4272的2848的图像,我想将它扩展到尺寸为1024×768,然后将得到的形象应该是1024 683和填充(带黑色边框)到1024×768。

我该如何做到这一点与图像大于所需的尺寸和小于要求的大小,并且还没有出来到我需要的确切大小的缩放图像一次缩放?

+0

为什么你不能只用数学来计算其他维度? –

+0

@CodyGray究竟是什么“其他”维度?这是一个二维图像,需要在保持高宽比的同时缩小比例。我尝试过只考虑宽高比,并找出与目标尺寸接近的宽度和高度的共同点,并且它从未正确运作。 –

回答

38

目标参数:

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, new Rectangle(((int)width - scaleWidth)/2, ((int)height - scaleHeight)/2, scaleWidth, scaleHeight)); 

并且不要忘记做一个bmp.Save(filename)来保存结果文件。

+1

这创建了一个纯黑色的图像。 –

+0

完美适合我,除非您确定自己找到问题,否则无需冷静下来。删除'FillRectangle'行,看看你得到了什么。只是再次测试,它工作正常。我在.NET 4.0上,如果这有所作为。 – yamen

+0

如果目标尺寸均小于图片尺寸,则不起作用。 “scale”变成0.0。根据我所能说的,它也不会保留宽高比。 –

99

位图的构造已经调整大小内置的。

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

+2

谢谢。这帮了很多。我知道这是一个古老的答案,但是为什么我的新形象看起来模糊不清?我是否需要设置任何插值模式? – theGreenCabbage

+1

这是不是只是在一个新的更小的位图内绘制原始位图?图像的一部分应该被剪切掉。 – DerpyNerd

+2

*这是否只是在一个新的更小的位图内绘制原始位图?* TFM的链接就在那里:*从指定的现有图像初始化一个新的Bitmap类实例,**缩放到指定的大小** 。* –

相关问题