【问题标题】:Convert Tif indexed 8-bit colour to 32-bit colour将 Tif 索引的 8 位颜色转换为 32 位颜色
【发布时间】:2012-01-25 15:43:38
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 太好了,谢谢!这似乎奏效了。颜色值为 0...65536,所以我除以 65535 并乘以 255,但它们与预期的颜色非常不同。
    • 您使用的是从 -32768 到 32767 的 short。我不知道 libtiff 是否使用整个范围;无论哪种方式,您的计算都不正确。
    • 对不起,我应该提到我现在正在使用 ushort。计算正确。
    • 在这种情况下,ARGB 字节的顺序可能是错误的。 Color 类使用 AARRGGBB(即 A 是 MSB,B 是 LSB)。您可以尝试调用FromArgb(blue, green, red, 255) 来反转它们。如果这没有帮助,请查看 tiff/libtiff 文档以了解实际订单。
    • 我刚刚查看了文档; 24 位 RGB 在 tiff 中更常见。所以你可能想要FromArgb(0, red, green, blue)FromArgb(0, blue, green, red)
    【解决方案2】:

    在 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();
    

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 2016-10-09
      • 2011-08-23
      • 2015-05-19
      • 1970-01-01
      • 2012-09-30
      • 2013-01-24
      相关资源
      最近更新 更多