2009-07-25 12 views
2

ich einige kleine transparente GIF-Bilder haben (unter 100x100) und schrieb den folgenden Code durch alle Pixel iterieren mir die RGB-Werte zu geben:C# Graphics Newbie Frage

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); 
     } 
    } 


} 

Der Code (wenn auch langsam funktioniert, weil GetPixel und die Formatierung der Strings), aber was mich am meisten überraschte war, dass die Ausgabe meldet, dass die transparenten Pixel schwarz sind! Ich wundere mich warum?

0 => Rot: 0 Grün: 0 Blue: 0
1 => Rot: 0 Grün: 0 Blue: 0 ...

Nun lassen Sie uns sagen, wenn ich tat ein transparentes GIF-Bild mit ein schwarzer Hintergrund, der 25% des Bildbereichs abdeckt, woher weiß ich, ob das Pixel transparent oder schwarz ist?

Antwort

2

Sie sollten die alpha channel der anstelle der roten, grünen oder blauen Kanäle überprüfen.

2

Leider kann ich keine detaillierte Antwort geben, aber GIF speichert Farben in einer Palette (im Grunde Array) mit bis zu 256 Einträgen, nicht nach RGB-Wert. Transparenz ist also einem Element im Array und nicht einer bestimmten Farbe zugeordnet. Sie könnten rgb (0,0,0) einer anderen Position in der Palette zuweisen, was sowohl Transparenz als auch reines Schwarz erlaubt.

5

Bilder haben wirklich 4 Attribute: Rot, Grün, Blau und Alpha.

Alpha ist wie transparent ein Bereich ist. GIF-Bilder unterstützen nur transparent/nicht transparent im Gegensatz zu anderen Formaten wie PNG, die volle Alpha-Unterstützung haben, so dass Sie beispielsweise 40% transparente Pixel verwenden können.

Sie können es mit col.A in Ihrem Code oben zugreifen.

Als Referenz der MSDN Color-Struktur ist http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx

0

Unter Berücksichtigung der anderen hilfreichen Antworten, sobald Sie an jedem Pixel in Bezug auf den Alpha-Wert anfangen zu denken, wie Sie den Unterschied zwischen vollständig transparent sagen könnte, schwarz, komplett transparent blau, orange oder gelb? Sie unterscheiden sich nicht wirklich, wenn Sie sie auf vorhandene Pixel zeichnen: Die Farben unten sind unverändert, wenn Sie eine (perfekt) transparente Schicht darüber malen. Wenn diese transparenten Pixel in Ihrem GIF in Ihrem Schleifencode schwarz erscheinen, dann nur deshalb, weil es eine übliche, vernünftige Vorgabe ist, alle Speicherwerte auf Null zu setzen (R = 0, G = 0, B = 0, A = 0) --- das ist "transparent schwarz" (auf irgendeiner Ebene).