2009-07-25 45 views
2

我有一些小的透明GIF图像(在100×100),并写了下面的代码在所有的像素迭代给我的RGB值:C#图形新手问题

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 =>红色:绿色0:0蓝:0
1 =>红色:绿色0:0蓝:0 ...

现在让我们假设,如果我也有一个透明的gif图像一个覆盖图像面积25%的黑色背景,我怎么知道像素是透明还是黑色?

回答

2

对不起,我不能提供详细的答案,但GIF将颜色存储在调色板(基本上是阵列)中,最多256个条目,而不是RGB值。所以透明度与数组中的元素相关联,而不是特定的颜色。您可以将rgb(0,0,0)分配给调色板中的不同位置,从而允许透明度和纯黑色。

5

图片真的有4个属性:红色,绿色,蓝色和阿尔法。

Alpha是一个区域是多么透明。 GIF图像只支持透明/不透明,不像其他格式,如PNG,具有完整的alpha支持,所以你可以做像40%透明像素的东西。

您可以在上面的代码中用col.A访问它。

作为参考,MSDN Color结构是http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx

0

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