我有一些小的透明gif图像(100x100以下)并编写了以下代码来遍历所有像素以给我RGB值:
private void IteratePixels(string filepath)
{
string dataFormat = String.Empty;
Bitmap objBitmap = new Bitmap(filepath);
int counter = 0;
for (int y = 0; y < objBitmap.Height; y++)
{
for (int x = 0; x < objBitmap.Width; x++)
{
Color col = objBitmap.GetPixel(x, y);
dataFormat = String.Format("{0} => Red: {1:x} Green: {2:x} Blue: {3:x}",
counter++, col.R, col.G, col.B);
System.Diagnostics.Debug.WriteLine(dataFormat);
// Perform an operation on the Color value here.
// objBitmap.SetPixel(x, y, col);
}
}
}
代码可以工作(虽然因为GetPixel和字符串格式化很慢),但我最惊讶的是输出报告透明像素是黑色的!我想知道为什么?
0 =&gt;红色:0绿色:0蓝色:0
1 =&gt;红色:0绿色:0蓝色:0
...
现在让我们说如果我确实有一个透明的gif图像,黑色背景覆盖图像区域的25%,我怎么知道像素是透明还是黑色?
答案 0 :(得分:5)
图片确实有4个属性:红色,绿色,蓝色和Alpha。
Alpha是一个区域的透明度。 GIF图像仅支持透明/不透明,不像PNG那样具有完全alpha支持的其他格式,因此您可以执行40%透明像素等操作。
您可以在上面的代码中使用col.A访问它。
作为参考,MSDN颜色结构为http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx
答案 1 :(得分:2)
您应该检查alpha channel的Color structure,而不是红色,绿色或蓝色通道。
答案 2 :(得分:2)
抱歉,我无法提供详细的答案,但GIF在调色板(基本上是数组)中存储颜色,最多包含256个条目,而不是RGB值。因此透明度与数组中的元素相关联,而不是特定颜色。你可以将rgb(0,0,0)指定给调色板中的不同位置,同时允许透明度和纯黑色。
答案 3 :(得分:0)
记住其他有用的答案,一旦你开始考虑每个像素的alpha值,你怎么能区分完全透明的黑色,完全透明的蓝色,橙色或黄色?当您在任何现有像素上绘制它们时,它们并没有什么不同:当您在它们上面涂上(完美)透明涂层时,下面的颜色不会改变。如果你的gif中的那些透明像素在你的循环代码中变回黑色,那么这仅仅是因为将所有内存值设置为零是一个常见的,合理的默认值(R = 0,G = 0,B = 0,A = 0)---这是“透明的黑色”(在某种程度上)。