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. 将 InterpolationModeInterpolationMode.HighQualityBicubic 更改为 InterpolationMode.NearestNeighbor。这解决了透明度问题,但由于方法质量低下而无法接受。 2. 将调整后的图像保存为 .png。这会保存正确的 Alpha 值,重新打开图像会保持静止。所以完全拒绝使用BMP文件格式是我的解决方案