C # Графика Новичок Вопрос

2

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

Теги:
graphics
visual-studio-2008
gdi+

4 ответа

5

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

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

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

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

2

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

2

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню