我有这个代码来调整图像大小,但图像看起来不太好:
public Bitmap ProportionallyResizeBitmap(Bitmap src, int maxWidth, int maxHeight)
{
// original dimensions
int w = src.Width;
int h = src.Height;
// Longest and shortest dimension
int longestDimension = (w > h) ? w : h;
int shortestDimension = (w < h) ? w : h;
// propotionality
float factor = ((float)longestDimension) / shortestDimension;
// default width is greater than height
double newWidth = maxWidth;
double newHeight = maxWidth / factor;
// if height greater than width recalculate
if (w < h)
{
newWidth = maxHeight / factor;
newHeight = maxHeight;
}
// Create new Bitmap at new dimensions
Bitmap result = new Bitmap((int)newWidth, (int)newHeight);
using (Graphics g = Graphics.FromImage((System.Drawing.Image)result))
g.DrawImage(src, 0, 0, (int)newWidth, (int)newHeight);
return result;
}
答案 0 :(得分:1)
尝试将图形对象的InterpolationMode
设置为某个值,例如HighQualityBicubic
。这应该确保调整大小/缩放图像看起来比“默认”好得多。
所以,在您发布的代码中,而不是:
// Create new Bitmap at new dimensions
Bitmap result = new Bitmap((int)newWidth, (int)newHeight);
using (Graphics g = Graphics.FromImage((System.Drawing.Image)result))
g.DrawImage(src, 0, 0, (int)newWidth, (int)newHeight);
return result;
尝试这样做:
// Create new Bitmap at new dimensions
Bitmap result = new Bitmap((int)newWidth, (int)newHeight);
using (Graphics g = Graphics.FromImage((System.Drawing.Image)result))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(src, 0, 0, (int)newWidth, (int)newHeight);
}
return result;
(注意将InterpolationMode
属性设置为InterpolationMode枚举值之一的行。)
请看这个链接:
How to: Use Interpolation Mode to Control Image Quality During Scaling
有关在调整大小/缩放时控制图像质量的更多信息。
另见CodeProject文章:
Resizing a Photographic image with GDI+ for .NET
有关不同视觉效果的信息,各种InterpolationMode枚举设置将在图像上具有。 (大约三分之二的文章,在题为“最后一件事......”)的章节中。
答案 1 :(得分:0)
如果您需要动态调整大小我建议您尝试我最近写的HttpHandler I've posted the code on my blog(对不起,但是是意大利语)。
通过一些修改,您也可以使用该代码将转换后的图像保存在磁盘上。