0

所以我正在研究这个程序,由于某种原因粉红色不会变得透明,这是我的代码:

if (chatIcons.GetPixel(x, y) == Color.FromArgb(255, 0, 255) || chatIcons.GetPixel(x, y) == Color.FromArgb(0, 255, 255))
{
chatIcons.SetPixel(x, y, Color.FromArgb(0, 0, 0, 0));
}

0, 255, 255 是青色(有效) 255, 0, 255 是粉红色(无效) 为什么会这样?该代码在一个位上起作用,但在另一个位上不起作用。

哦,这是我的形象: 在此处输入图像描述

4

3 回答 3

1

我用 Axialis 打开了图像并看到了这个结果(没有修改,但放大了捕捉)......

放大

因此,这将得出这样的结论:图像内部的编码使得粉红色像素被某些解码器而不是其他解码器解释为透明的。Photoshop 按预期解码并呈现图像。您可能需要在 Photoshop 下打开并保存它以“覆盖”影响粉红色像素的任何编码。

还有关于你的颜色检测代码。使用 Photoshop 进行的非常深的缩放显示了许多伪影,以至于像您这样的精确检测方法可能会在大约 10-20% 的像素中失败。您可能会考虑使用类似于“IsNearlyPink”的检测方法

下面用 Photoshop 放大...

在此处输入图像描述

于 2013-07-20T22:31:49.267 回答
1

如果它的位图(如果你的图像支持 Alpha)你可以试试这个:

chatIcons = ChangeColor(chatIcons,(byte)255,(byte)0,(byte)255);

public static Bitmap ChangeColor(Bitmap sourceBitmap, byte blue, byte green, byte red)
{
       BitmapData sourceData = sourceBitmap.LockBits(new Rectangle(0, 0,
                                    sourceBitmap.Width, sourceBitmap.Height),
                                    ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

       byte[] pixelBuffer = new byte[sourceData.Stride * sourceData.Height];

       Marshal.Copy(sourceData.Scan0, pixelBuffer, 0, pixelBuffer.Length);

       sourceBitmap.UnlockBits(sourceData);

       for (int k = 0; k + 4 < pixelBuffer.Length; k += 4)
       {
           if (pixelBuffer[k] == blue && pixelBuffer[k + 1] == green && pixelBuffer[k + 2] == red)
           {
                pixelBuffer[k] = 0;
                pixelBuffer[k + 1] = 0;
                pixelBuffer[k + 2] = 0;
                pixelBuffer[k + 3] = 0;
           }
        }

        Bitmap resultBitmap = new Bitmap(sourceBitmap.Width, sourceBitmap.Height);

        BitmapData resultData = resultBitmap.LockBits(new Rectangle(0, 0,
                                    resultBitmap.Width, resultBitmap.Height),
                                    ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

         Marshal.Copy(pixelBuffer, 0, resultData.Scan0, pixelBuffer.Length);
            resultBitmap.UnlockBits(resultData);

         return resultBitmap;
}
于 2013-07-20T22:54:44.867 回答
0

您的位图对象的 PixelFormat 必须支持 Alpha 通道,例如 PixelFormats.Bgra32

于 2013-07-20T22:00:16.140 回答