【发布时间】:2015-09-22 05:02:38
【问题描述】:
我正在寻找一种在不丢失其实际形状的情况下调整位图大小的方法,同时牢记新大小不得与原始图像尺寸成比例。
确切地说,我想将一个直立八 (40x110) 的图像调整为 29x29 位图,我正在寻找一个函数来将原始比例相对于它的新图像,同时填充新创建的空间(宽度)具有白色并且从实际 8 到其白色基线具有相同的侧间隙。
很遗憾,这并不能满足我的要求:
public static Bitmap ResizeImage(Image image, int width, int height)
{
var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
更新 1: 比例调整新功能:
public static Bitmap ResizeImageProportional(Bitmap bitmap, int width, int height)
{
Bitmap destImage;
Rectangle destRect;
int destH, destW, destX, dextY;
if (bitmap.Height > bitmap.Width)
{
destH = height;
destW = bitmap.Width / bitmap.Height * height;
destX = (width - destW) / 2;
dextY = 0;
}
else if (bitmap.Height < bitmap.Width)
{
destH = bitmap.Height / bitmap.Width * width;
destW = width;
destX = 0;
dextY = (height - destH) / 2;
}
else
// if (bitmap.Width == bitmap.Height)
{
destH = height;
destW = width;
destX = 0;
dextY = 0;
}
destRect = new Rectangle(destX, dextY, destW, destH);
destImage = new Bitmap(width, height);
destImage.SetResolution(bitmap.HorizontalResolution, bitmap.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(bitmap, destRect, 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
不幸的是,我使用这个解决方案总是得到一个空位图。我首先将原始位图裁剪为一个矩形,其中我的位图元素完全适合。否则将位图本身的左基线也是其中图形元素的基线,而整个背景是白色的。 然后我将这个位图(大约 40x80)放入“ResizeImageProportional”(原始后期编辑)函数中,宽度和高度值为 29。
【问题讨论】:
-
目前的解决方案有什么问题?
-
您将 (0,0) 用于源 和 目标位置。这不是你想要的,对吧?您需要计算目的地位置!
标签: c# .net image bitmap resize