图像不透明

时间:2013-07-20 21:46:49

标签: c#

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

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是粉红色(不起作用) 这是为什么?代码适用于一位而不是另一位。

哦,这是我的形象: enter image description here

3 个答案:

答案 0 :(得分:1)

我用Axialis打开了图像并显示了这个结果(没有修改,但是为了捕获而放大了)......

zoomed

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

还有关于颜色检测的代码。使用Photoshop进行非常深的缩放会发现大量伪像,以至于像你这样的精确检测方法可能会在大约10-20%的像素中失败。您可以考虑采用'IsNearlyPink'

的检测方法

下面的Photoshop缩放......

enter image description here

答案 1 :(得分: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;
}

答案 2 :(得分:0)

Bitmap-Object的PixelFormat必须支持Alpha-Channel,如PixelFormats.Bgra32