Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 图像不是';这不是透明的_C# - Fatal编程技术网

C# 图像不是';这不是透明的

C# 图像不是';这不是透明的,c#,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是粉红色(不起作用

因此,我正在开发这个程序,出于某些原因,粉色不会透明,以下是我的代码:

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是粉红色(不起作用) 为什么呢?代码在一位上工作,但在另一位上不工作

哦,这是我的照片:

位图对象的像素格式必须支持Alpha通道,就像像素格式一样。Bgra32

我用Axialis打开了图像,并显示了此结果(无需修改,但为捕获而缩放)

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

还有你的颜色检测代码。使用Photoshop进行的深度缩放显示了大量的伪影,以至于像你这样的精确检测方法可能会在大约10-20%的像素中失败。你可以考虑沿着“接近粉红”< /P>线的检测方法。 下面是Photoshop缩放

如果其位图(如果您的图像支持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;
}
chatIcons=ChangeColor(chatIcons,(字节)255,(字节)0,(字节)255);
公共静态位图更改颜色(位图源位图、字节蓝色、字节绿色、字节红色)
{
BitmapData sourceData=sourceBitmap.LockBits(新矩形(0,0,0,
sourceBitmap.Width、sourceBitmap.Height),
ImageLockMode.ReadOnly,PixelFormat.Format32bppArgb);
byte[]pixelBuffer=新字节[sourceData.Stride*sourceData.Height];
复制(sourceData.Scan0,pixelBuffer,0,pixelBuffer.Length);
sourceBitmap.UnlockBits(sourceData);
对于(int k=0;k+4
理想情况下,它应该可以工作…你检查过它是否精确为0,255,255吗?也许可以尝试
新颜色(0,0,0,0)
另外255,0,255是粉红色,0,255,255是青色。谢谢Matthew,现在更新帖子。哦,还有Rameez,我已经检查了无数次。我相信它实际上是洋红色而不是粉红色。我如何使它支持Alpha通道?嗯,我不明白,在GIMP中它是纯粉色的:我刚刚下载Axialis并打开图像,它仍然是粉色的。编辑:哦,等等,我现在看到了。@BLEANDES2010,你看到了什么?你能修正你的问题吗?我用Axialis打开了这张图片,我添加了洋红颜色RGB 255 0 255,并保存了下来,但它仍然不能工作:/对不起,我是这个网站的新手。@bloodless2010,欢迎访问!我建议采纳我们交换的这些意见,并编辑您的原始问题,这样人们就会知道您尝试了什么。因此,文化真正欣赏人们迄今为止所做尝试的先进知识。转到您的问题并单击“编辑”等。这很有趣!哦,哇,效果很好,除了右下角有一个洋红色像素。这可能是图像的问题,因为我使用了相同的代码使水透明,效果很好,我真的很感谢你。我添加了你的代码,效果很好,但是在右下角有一个洋红色的像素不会消失:sok我不知道为什么它会这样做,所有的图像都很好,但是在你的图像中,我尝试了,它留下了最后一个像素洋红色,可能是边界上的某种阴影,但是在for循环中,它的k+4