将Tif索引的8位颜色转换为32位颜色

时间:2012-01-25 15:43:38

标签: c# .net windows tiff libtiff.net

我有一个索引的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 个答案:

答案 0 :(得分:1)

尝试System.Drawing.Color.FromArgb(red, green, blue).ToArgb()

但是,如果LibTiff和Win32对其ARGB值使用相同的字节顺序,这只会给出正确的结果。它还假设您的红色,绿色和蓝色值在0到255之间;你可以扩展它们。

答案 1 :(得分:0)

在TIFF ColorMap中,每种颜色的值数为2 ** BitsPerSample。因此,8位调色板颜色图像的ColorMap字段将具有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();