1

我有一个索引 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 位像素值?

4

2 回答 2

1

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

但是,只有在 LibTiff 和 Win32 都对它们的 ARGB 值使用相同的字节顺序时,这才会给出正确的结果。它还假设您的红色、绿色和蓝色值在 0 到 255 的范围内;如果没有,您可以缩放它们。

于 2012-01-25T16:15:25.120 回答
0

In a TIFF ColorMap, the number of values for each color is 2**BitsPerSample. Therefore, the ColorMap field for an 8-bit palette-color image would have 3 * 256 values.

The width of each value is 16 bits. 0 represents the minimum intensity, and 65535 represents the maximum intensity. Black is represented by 0,0,0, and white by 65535, 65535, 65535.

So, you probably should use following code:

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();
于 2012-01-25T22:44:16.563 回答