C#图形新手问题

时间:2009-07-25 20:21:53

标签: c# .net visual-studio-2008 graphics gdi+

我有一些小的透明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%,我怎么知道像素是透明还是黑色?

4 个答案:

答案 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 channelColor structure,而不是红色,绿色或蓝色通道。

答案 2 :(得分:2)

抱歉,我无法提供详细的答案,但GIF在调色板(基本上是数组)中存储颜色,最多包含256个条目,而不是RGB值。因此透明度与数组中的元素相关联,而不是特定颜色。你可以将rgb(0,0,0)指定给调色板中的不同位置,同时允许透明度和纯黑色。

答案 3 :(得分:0)

记住其他有用的答案,一旦你开始考虑每个像素的alpha值,你怎么能区分完全透明的黑色,完全透明的蓝色,橙色或黄色?当您在任何现有像素上绘制它们时,它们并没有什么不同:当您在它们上面涂上(完美)透明涂层时,下面的颜色不会改变。如果你的gif中的那些透明像素在你的循环代码中变回黑色,那么这仅仅是因为将所有内存值设置为零是一个常见的,合理的默认值(R = 0,G = 0,B = 0,A = 0)---这是“透明的黑色”(在某种程度上)。