HighQualityBicubic 插值在调整大小时添加黑色背景
HighQualityBicubic interpolation adds black background during resizing
我正在实现图像缩放功能。当我使用 HighQualityBicubic 插值模式(从质量角度来看是首选)时,我在调整大小的图像上得到黑色背景(仅在源图像的矩形中。在目标矩形的填充区域中它仍然是透明的)。
输入图像是具有透明背景的 bmp。
输出也是 bmp 32 bpp。
有趣的是,当我将 InterpolationMode 更改为 NearestNeighbor 时,某些输入图像背景在调整大小后保留为透明,而对于其他输入则无济于事。
我做错了什么?
public Bitmap DrawScaledImage(Image img, int width, int height, int scaledWidth, int scaledHeight)
{
var resultImg = new Bitmap(width, height, PixelFormat.Format32bppArgb);
resultImg.SetResolution(img.HorizontalResolution, img.VerticalResolution);
using (Graphics grPhoto = Graphics.FromImage(resultImg))
{
grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(img,
new Rectangle(0, 0, scaledWidth, scaledHeight), //0;0 - image is drawn in left top corner
new Rectangle(0, 0, img.Width, img.Height),
GraphicsUnit.Pixel);
}
return resultImg;
}
更新
发现有趣的事情:
我在源图像中选择了随机透明像素并在调试中使用了它的 ARGB:它是 ARGB=(255, 0, 0, 0) - 非常清楚
然后我选择了相同的像素,它在缩放后在目标图像中是透明的,它仍然是 ARGB=(255, 0, 0, 0) 但在 Paint.Net 中它显示为黑色。
然后我从目标图像中选择了另一个随机像素,该像素在 Paint.Net 中显示为透明,其 ARGB 模式为 ARGB=(0, 0, 0, 0) - 什么?
所以也许是个愚蠢的问题 - 为什么第一张图片的透明像素是 [255;0;0;0] 而第二张 [255;0;0;0] 意味着黑色和透明是 [0;0;0; 0]。
看起来有什么东西掉下来了。 Alfa 通道在缩放后将其含义从 255-透明变为 255-不透明。有任何想法吗?
所以我发现原因是在使用 InterpolationMode = InterpolationMode.HighQualityBicubic
调整大小后以 BMP 格式保存文件的一些错误行为。以下是复制案例:
1. 如果我创建像素格式 PixelFormat.Format32bppArgb
的全新图像,请使用像素进行一些程序操作(例如绘制一些线条)并保存为 bmp - 完全没问题,透明度会保存并在 Paint.Net 中可见。
2. 如果我打开现有的 bmp 图像已经用透明度缩放它 up/down 和 Graphics.DrawImage
方法在调试中似乎都很好。透明像素的 Alpha = 0。然后我将该图像保存为 bmp。然后用 Image.FromFile("resized.bmp")
之类的代码再次打开它,它的像素格式与保存前不一样:现在是 Format32bppRgb
但是保存的图像有 Format32bppArgb
。在打开的图像上,透明像素现在具有 Alpha = 255。这就是为什么在 Paint.Net 中打开时我在调整大小后看到黑色而不是透明的原因。
我找到了 2 种解决方法来在调整大小后保持透明度:
1. 将 InterpolationMode
从 InterpolationMode.HighQualityBicubic
更改为 InterpolationMode.NearestNeighbor
。这解决了透明度问题,但由于方法质量低下而无法接受。
2. 将调整后的图像保存为 .png。这会保存正确的 Alpha 值,重新打开图像会保持静止。所以完全拒绝使用BMP文件格式是我的解决方案
我正在实现图像缩放功能。当我使用 HighQualityBicubic 插值模式(从质量角度来看是首选)时,我在调整大小的图像上得到黑色背景(仅在源图像的矩形中。在目标矩形的填充区域中它仍然是透明的)。 输入图像是具有透明背景的 bmp。 输出也是 bmp 32 bpp。 有趣的是,当我将 InterpolationMode 更改为 NearestNeighbor 时,某些输入图像背景在调整大小后保留为透明,而对于其他输入则无济于事。 我做错了什么?
public Bitmap DrawScaledImage(Image img, int width, int height, int scaledWidth, int scaledHeight)
{
var resultImg = new Bitmap(width, height, PixelFormat.Format32bppArgb);
resultImg.SetResolution(img.HorizontalResolution, img.VerticalResolution);
using (Graphics grPhoto = Graphics.FromImage(resultImg))
{
grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(img,
new Rectangle(0, 0, scaledWidth, scaledHeight), //0;0 - image is drawn in left top corner
new Rectangle(0, 0, img.Width, img.Height),
GraphicsUnit.Pixel);
}
return resultImg;
}
更新 发现有趣的事情: 我在源图像中选择了随机透明像素并在调试中使用了它的 ARGB:它是 ARGB=(255, 0, 0, 0) - 非常清楚 然后我选择了相同的像素,它在缩放后在目标图像中是透明的,它仍然是 ARGB=(255, 0, 0, 0) 但在 Paint.Net 中它显示为黑色。 然后我从目标图像中选择了另一个随机像素,该像素在 Paint.Net 中显示为透明,其 ARGB 模式为 ARGB=(0, 0, 0, 0) - 什么?
所以也许是个愚蠢的问题 - 为什么第一张图片的透明像素是 [255;0;0;0] 而第二张 [255;0;0;0] 意味着黑色和透明是 [0;0;0; 0]。
看起来有什么东西掉下来了。 Alfa 通道在缩放后将其含义从 255-透明变为 255-不透明。有任何想法吗?
所以我发现原因是在使用 InterpolationMode = InterpolationMode.HighQualityBicubic
调整大小后以 BMP 格式保存文件的一些错误行为。以下是复制案例:
1. 如果我创建像素格式 PixelFormat.Format32bppArgb
的全新图像,请使用像素进行一些程序操作(例如绘制一些线条)并保存为 bmp - 完全没问题,透明度会保存并在 Paint.Net 中可见。
2. 如果我打开现有的 bmp 图像已经用透明度缩放它 up/down 和 Graphics.DrawImage
方法在调试中似乎都很好。透明像素的 Alpha = 0。然后我将该图像保存为 bmp。然后用 Image.FromFile("resized.bmp")
之类的代码再次打开它,它的像素格式与保存前不一样:现在是 Format32bppRgb
但是保存的图像有 Format32bppArgb
。在打开的图像上,透明像素现在具有 Alpha = 255。这就是为什么在 Paint.Net 中打开时我在调整大小后看到黑色而不是透明的原因。
我找到了 2 种解决方法来在调整大小后保持透明度:
1. 将 InterpolationMode
从 InterpolationMode.HighQualityBicubic
更改为 InterpolationMode.NearestNeighbor
。这解决了透明度问题,但由于方法质量低下而无法接受。
2. 将调整后的图像保存为 .png。这会保存正确的 Alpha 值,重新打开图像会保持静止。所以完全拒绝使用BMP文件格式是我的解决方案