Преобразовать индексированный Tif 8-битный цвет в 32-битный цвет - PullRequest
1 голос
/ 25 января 2012

У меня есть индексированное изображение Tiff, которое я читаю, используя LibTiff.Net для создания растрового изображения раздела большого изображения. Я считаю, что Tiff будет иметь 256 цветовых записей, которые я хочу преобразовать в 256 32-битных значений пикселей, которые будут использоваться в выходном растровом изображении.

int bitsPerSample = tif.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt();
FieldValue[] colourIndex = tif.GetField(TiffTag.COLORMAP);
int[] palette = new int[256];
for( int i = 0; i < 256; i++ )
{
    short red = colourIndex[0].ToShortArray()[i];
    short green = colourIndex[1].ToShortArray()[i];
    short blue = colourIndex[2].ToShortArray()[i];

    palette[i] = ?
}

Как преобразовать шорты RGB в значение 32-битного пикселя?

Ответы [ 2 ]

1 голос
/ 25 января 2012

Попробуйте System.Drawing.Color.FromArgb(red, green, blue).ToArgb().

Однако это даст правильные результаты только в том случае, если LibTiff и Win32 используют одинаковый порядок байтов для своих значений ARGB. Также предполагается, что ваши значения красного, зеленого и синего находятся в диапазоне от 0 до 255; Вы можете масштабировать их, если нет.

0 голосов
/ 26 января 2012

В TIFF ColorMap количество значений для каждого цвета равно 2 ** BitsPerSample.Следовательно, поле ColorMap для 8-битного цветового изображения палитры будет иметь значения 3 * 256.

Ширина каждого значения составляет 16 бит.0 представляет минимальную интенсивность, а 65535 представляет максимальную интенсивность.Черный представлен 0,0,0, а белый 65535, 65535, 65535.

Итак, вам, вероятно, следует использовать следующий код:

ushort red = colourIndex[0].ToShortArray()[i];
ushort green = colourIndex[1].ToShortArray()[i];
ushort blue = colourIndex[2].ToShortArray()[i];

palette[i] = System.Drawing.Color.FromArgb(red / 255, green / 255, blue / 255).ToArgb();
...