0

这是我的代码:

BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
UnmanagedImage img = new UnmanagedImage(bmpData);
//MAIN BLOCK
BayerDithering filter = new BayerDithering();
img = new UnmanagedImage(img.ImageData, img.Width, img.Height, img.Stride, PixelFormat.Format8bppIndexed);
filter.ApplyInPlace(img);
//END MAIN BLOCK
bitmap.UnlockBits(bmpData);

这是结果:截图

为什么结果没有被编译 Oo?我必须在“ MAIN BLOCK ”中改变什么?

4

1 回答 1

2
img = new UnmanagedImage(..., img.Stride, PixelFormat.Format8bppIndexed);

这就是问题开始的地方。您正在传递像素数据和 24bpp 图像的步幅,但撒谎并说它是 8bpp 图像。结果仍然是一个 24bpp 的图像和一个彻底混淆的过滤器。

这是行不通的,从 24bpp 到 8bpp 的转换要复杂得多。8bpp 图像不仅有不同的像素格式和步幅,它还需要一个颜色表(又名调色板)。创建具有 256 种颜色的良好颜色表以生成合理匹配的 8bpp 图像是很困难的。

您需要 AForge.Imaging.ColorReduction 命名空间中的一个类来完成这项工作。

于 2013-04-07T13:12:26.457 回答