我正在尝试使用C#将图像精确可预测地缩放到不同的分辨率,无论是放大还是缩小。当我使用外部工具(如Gimp)打开结果图像时,当前设置下的结果并不令人满意。
当缩小比例时,结果还可以(但远非完美),但是放大比例时会产生副作用:
此图片的分辨率为2x2像素。所有像素的alpha通道均设置为不透明。
将其放大到4x4像素后,得到以下结果:
显然,C#图形库在缩放图片时引入了透明度。如果给定的图片具有透明图片,则该方法仍应有效,因此删除alpha通道不是一个选项。
类似地,当缩小图片时,结果图像的边缘也存在问题,通常要么非常暗,要么是透明的。
有没有办法规避这种行为?
编辑2:使用
public Image Square(Image image, int res) {
Bitmap sq = new Bitmap(res, res, image.PixelFormat);
Graphics canvas = Graphics.FromImage(sq);
canvas.CompositingQuality = CompositingQuality.HighQuality;
canvas.SmoothingMode = SmoothingMode.None;
canvas.InterpolationMode = InterpolationMode.Bicubic;
canvas.DrawImage(sq, 0, 0, res, res);
return sq;
}
当缩小比例时,结果还可以(但远非完美),但是放大比例时会产生副作用:
此图片的分辨率为2x2像素。所有像素的alpha通道均设置为不透明。
![2x2 opaque](https://istack.dev59.com/Pfdwr.webp)
![4x4 with alpha](https://istack.dev59.com/zwbSe.webp)
类似地,当缩小图片时,结果图像的边缘也存在问题,通常要么非常暗,要么是透明的。
有没有办法规避这种行为?
编辑:我已经尝试了仅缩小图像的最近邻算法,但结果却是这样的:
编辑2:使用
WrapMode.TileFlipXY
,透明边缘消失了,但是红色仅占图像的25%,而不是应有的50%: