【发布时间】:2017-11-14 17:48:20
【问题描述】:
我正在尝试将 C# 中的图像精确且可预测地缩放到不同的分辨率,无论是向上还是向下。当我使用 Gimp 等外部工具打开生成的图像时,结果并不符合我当前的设置。
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 通道设置为对所有像素不透明。
显然,C# 图形库在缩放图片时引入了透明度。如果给定图像具有透明图片,此方法应该仍然有效,因此不能选择删除 alpha 通道。
同样,缩小图片时,生成的图片的边缘也会出现问题,通常要么很暗,要么很透明。
有没有办法规避这种行为?
编辑:我已经尝试过 NearestNeighbor 仅用于缩小规模,但结果如下:
编辑 2:使用WrapMode.TileFlipXY,透明边缘消失了,但红色仅占图像的 25%,而不是应有的 50%:
【问题讨论】:
-
只有 NearestNeighbor 可以避免插值伪影。不要忘记更改 PixelOffsetMode。
标签: c# .net resolution scaling imaging