编辑8bpp索引位图

Ped*_* Sá 3 c# gdi+ indexed bitmap

我正在尝试编辑8bpp的像素.由于此PixelFormat已编制索引,因此我知道它使用颜色表来映射像素值.即使我可以通过将位图转换为24bpp来编辑位图,但8bpp编辑速度要快得多(13ms vs 3ms).但是,在访问8bpp位图时更改每个值会导致一些随机的rgb颜色,即使PixelFormat仍为8bpp.

我目前正在开发c#,算法如下:

(C#)

1-将原始位图加载到8bpp

2-创建具有8bpp的空温度位图,其大小与原始尺寸相同

两个位图的3-LockBits,使用P/Invoke调用c ++方法,我传递每个BitmapData对象的Scan0.(我使用c ++方法,因为它在迭代Bitmap的像素时提供更好的性能)

(C++)

4-根据一些参数创建一个int [256]调色板,并通过将原始像素值传递到调色板来编辑临时位图字节.

(C#)

5- UnlockBits.

我的问题是如何在没有奇怪的rgb颜色的情况下编辑像素值,甚至更好地编辑8bpp位图的颜色表?

Dai*_*Dai 10

根本没有必要进入C++领域或使用P/Invoke; C#完全支持指针和不安全的代码; 我甚至可能会猜测这会导致你的问题.

颜色可能来自默认的调色板.您会发现更改调色板应该不会很慢.这是我创建灰度调色板的方法:

image = new Bitmap( _size.Width, _size.Height, PixelFormat.Format8bppIndexed);
ColorPalette pal = image.Palette;
for(int i=0;i<=255;i++) {
    // create greyscale color table
    pal.Entries[i] = Color.FromArgb(i, i, i);
}
image.Palette = pal; // you need to re-set this property to force the new ColorPalette
Run Code Online (Sandbox Code Playgroud)


Pau*_*ane 0

您是否尝试过加载 a System.Drawing.Image?该类使您可以访问调色板。一旦调色板设置System.Drawing.Image好,您就可以将其包装起来。System.Drawing.Bitmap

我不确定如何System.Drawing.BitMap.SetPixel()处理索引彩色图像。它可能会尝试将其映射到调色板中最接近的颜色。