【问题标题】:Can't set palette in bitmap无法在位图中设置调色板
【发布时间】:2011-08-03 09:03:20
【问题描述】:

我一直在写一个 PCX 解码器,到目前为止,PCX 图像本身解析得很好,但我不知道如何设置位图的调色板。

我已经创建了一个这样的位图:

Bitmap bmp = new Bitmap(width,
                        height,
                        stride2,
                        System.Drawing.Imaging.PixelFormat.Format8bppIndexed,
                        pixels);

但我似乎无法使用以下方法设置调色板:

for (int i = 0; i < 256; i += 3)
{
    Color b = new Color();
    b = Color.FromArgb(palette[i], palette[i + 1], palette[i + 2]);
    bmp.Palette.Entries.SetValue(b, i);
}

在这个例子中,我已经阅读了 pcx 文件的调色板中的每个字节,并将它们存储在调色板 [] 中。从那里,我用它来设置位图调色板中的条目。如何设置颜色?

【问题讨论】:

    标签: c# image image-processing bitmap palette


    【解决方案1】:

    这也让我感到困惑。似乎 bitmap.Palette 返回位图调色板的克隆。修改副本后,您需要使用bitmap.Palette = palette 重置位图的调色板,例如

    ColorPalette palette = bitmap.Palette;
    Color entries = palette.Entries;
    ....
    entries[i] = new Color(...);
    ....
    bitmap.Palette = palette; // The crucial statement
    

    http://www.charlespetzold.com/pwcs/PaletteChange.html

    【讨论】:

    • 是的,我认为你是对的,它返回一个克隆,这是我知道的唯一解释。
    【解决方案2】:

    根据.net 中Image 类的Microsoft Reference SourcePalette 属性,内部使用GDI+ Flat APIs 来处理调色板。 GdipGetImagePalette 用于在get 方法中初始化ColorPalette 对象,GdipSetImagePalette 用于将ColorPalette 对象数据写回设备是set 方法。

    每次在for 循环中,bmp.Palette.Entries.SetValue(b, i); 行都会强制图像调用GdipGetImagePalette 并且bmp.Palette 的数据重新初始化,因此您可以看到循环后bmp.Palette 没有任何更改。

    要解决此问题,您必须执行以下操作:

    1. 将新别名分配给bmp.Palette,方法是将其分配给一个变量,
    2. 用新别名修改它(这样可以防止重新加载),
    3. 然后放回bmp.Palette

    代码:

    var newAliasForPalette = bmp.Palette; // Palette loaded from graphic device
    for (int i = 0; i < 256; i++)
    {
        newAliasForPalette.Entries[i] = myColor[i];
    }
    bmp.Palette = newAliasForPalette; // Palette data wrote back to the graphic device
    

    在我看来,将 Palette 的定义替换为 Microsoft 的 GetPalette()SetPalette() 方法将有助于避免混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2014-01-09
      • 2016-10-01
      • 2016-09-13
      相关资源
      最近更新 更多