所以我正在研究这个程序,由于某种原因,粉红色不会透明,这是我的代码:
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是粉红色(不起作用) 这是为什么?代码适用于一位而不是另一位。
哦,这是我的形象:
答案 0 :(得分:1)
我用Axialis打开了图像并显示了这个结果(没有修改,但是为了捕获而放大了)......
因此,这将得出以下结论:图像内部的编码使得粉红色像素被SOME解码器解释为透明而不是其他解码器。 Photoshop解码并按预期显示图像。您可能需要在Photoshop下打开并保存它以“覆盖”任何影响粉红色像素的编码。
还有关于颜色检测的代码。使用Photoshop进行非常深的缩放会发现大量伪像,以至于像你这样的精确检测方法可能会在大约10-20%的像素中失败。您可以考虑采用'IsNearlyPink'
的检测方法下面的Photoshop缩放......
答案 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