C # Графика Новичок Вопрос - PullRequest
2 голосов
/ 26 июля 2009

У меня есть несколько небольших прозрачных 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 ]

5 голосов
/ 26 июля 2009

Изображения действительно имеют 4 атрибута: красный, зеленый, синий и альфа.

Альфа - это то, насколько прозрачна область. GIF-изображения поддерживают только прозрачный / непрозрачный, в отличие от других форматов, таких как PNG, которые имеют полную альфа-поддержку, поэтому вы можете делать такие вещи, как 40% прозрачных пикселей.

Вы можете получить к нему доступ с помощью col.A в приведенном выше коде.

Для справки, структура MSDN Color: http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx

2 голосов
/ 26 июля 2009

Извините, я не могу дать подробный ответ, но GIF хранит цвета в палитре (в основном, в массиве) до 256 записей, а не по значению RGB. Таким образом, прозрачность связана с элементом в массиве, а не с конкретным цветом. Вы можете назначить rgb (0,0,0) на другую позицию в палитре, что позволяет использовать как прозрачность, так и чистый черный цвет.

2 голосов
/ 26 июля 2009

Вы должны проверить альфа-канал структуры Color вместо красного, зеленого или синего каналов.

0 голосов
/ 26 июля 2009

Имея в виду другие полезные ответы, как только вы начнете думать в терминах значения альфа-канала в каждом пикселе, как вы сможете определить разницу между полностью прозрачным черным, полностью прозрачным синим, оранжевым или желтым? Они на самом деле не отличаются, когда вы рисуете их поверх любых существующих пикселей: цвета ниже не меняются, когда вы рисуете (идеально) прозрачный слой поверх них. Если эти прозрачные пиксели в вашем gif возвращаются черными в вашем циклическом коде, то это только потому, что это обычное, разумное значение по умолчанию, чтобы установить все значения памяти на ноль (R = 0, G = 0, B = 0, A =0) --- который является "прозрачным черным" (на некотором уровне).

...