У меня есть несколько небольших прозрачных изображений 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 = > Красный: 0 Зеленый: 0 Синий: 0
1 = > Красный: 0 Зеленый: 0 Синий: 0
...
Теперь скажем, если бы у меня было прозрачное изображение gif с черным фоном, покрывающим 25% области изображения, как бы узнать, прозрачен ли пиксель или черный?
Изображения действительно имеют 4 атрибута: красный, зеленый, синий и альфа.
Альфа - насколько прозрачна область. Изображения GIF поддерживают только прозрачные/непрозрачные, в отличие от других форматов, таких как PNG, которые имеют полную альфа-поддержку, поэтому вы можете делать такие вещи, как 40% прозрачные пиксели.
Вы можете получить доступ к нему с помощью col.A в своем коде выше.
Для справки структура структуры MSDN http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx
Извините, я не могу предоставить подробный ответ, но GIF хранит цвета в палитре (в основном, массив) с 256 элементами, а не значением RGB. Таким образом, прозрачность связана с элементом в массиве, а не с определенным цветом. Вы могли бы иметь rgb (0,0,0), назначенные в другую позицию в палитре, позволяя как прозрачность, так и чистый черный.
Вы должны проверить альфа-канал Цветная структура вместо красного, зеленого или синего каналов.
Помня о других полезных ответах, как только вы начнете думать с точки зрения альфа-значения на каждом пикселе, как вы могли бы рассказать о различии между полностью прозрачным черным, полностью прозрачным синим, оранжевым или желтым? Они не отличаются друг от друга, когда вы рисуете их поверх любых существующих пикселей: цвета ниже не изменяются, когда вы рисуете (совершенно) прозрачное покрытие поверх них. Если эти прозрачные пиксели в вашем gif возвращаются черным в ваш код цикла, то это только потому, что это обычное разумное значение по умолчанию, чтобы установить все значения памяти равными нулю (R = 0, G = 0, B = 0, A = 0) --- который является "прозрачным черным" (на некотором уровне).