如何将32bpp图像转换为索引格式?

时间:2009-02-23 20:54:04

标签: c# image-processing color-palette

所以这里是细节(我正在使用C#BTW):

我从服务器收到32bpp图像(JPEG压缩)。在某些时候,我想使用位图的Palette属性来为过饱和的像素(亮度> 240)着色。为此,我需要将图像转换为索引格式。

我尝试将图片转换为GIF,但质量下降了。我尝试通过以下方法以索引格式创建新的位图:

// causes a "Parameter not valid" error
Bitmap indexed = new Bitmap(orig.Width, orig.Height, PixelFormat.Indexed)

// no error, but the resulting image is black due to information loss I assume
Bitmap indexed = new Bitmap(orig.Width, orig.Height, PixelFormat.Format8bppIndexed)

我现在不知所措。用户不断更改此图像中的数据,因此我不想手动设置亮度大于>的像素。 240如果我可以避免它。如果我可以在创建图像时设置调色板一次,我的工作就完成了。如果我以错误的方式开始,请告诉我。

编辑:谢谢大家,这里有一些关于我试图完成的更多细节。

我们正在以高分辨率扫描组织切片(病理学应用)。我将界面写入实际的扫描仪。我们使用线扫描相机。为了测试相机的线速率,用户扫描很小的部分并查看图像。

图像显示在轨迹栏旁边。当用户移动轨迹条(调整线速率)时,我会改变图像的整体强度,以尝试模拟新线速下的样子。我目前使用ImageAttributes和ColorMatrix对象执行此操作。

当用户调整轨迹栏时,我调整矩阵。这不会给我每像素信息,但性能非常好。我可以在这里使用LockBits和一些不安全的代码,但如果可能的话我宁愿不重写它。当创建新图像时,我想要亮度值>>的所有像素。 240为红色。我以为预先为位图定义一个调色板将是一种干净的方式。

3 个答案:

答案 0 :(得分:1)

从32bpp变为8bpp索引将几乎总是导致质量损失,除非原始图像的总色彩少于256色。

您是否可以创建另一个图像,其中受影响的像素为红色,然后同时显示这两个图像?

因为你想要亮度> 240,您可以先将叠加转换为灰度,然后转换为索引以获得过亮的像素。

一旦你标记了罪犯,你就没有指定你在做什么,所以我不知道这是否有效。

答案 1 :(得分:0)

听起来像使用像素着色器可以轻松完成的事情。即使非常早期的着色器模型也会支持像这样简单的东西。

但问题是:

您是否可以在应用程序中包含着色器支持而无需太多麻烦?

你知道着色器编程吗?

编辑:

您可能没有可以执行此类操作的3D上下文= /

我大多只是在表达自己的想法。

逐个像素地操作图片应该可以实时使用单个CPU吗?

如果没有,请查看GPGPU编程和Open CL。

再次编辑:

如果您提供了有关该应用实际功能的详细信息,我们可能会提供更多帮助?例如,如果您正在制作网络应用程序,我的提示都没有意义。

答案 2 :(得分:0)

感谢大家的帮助。看来这可以使用ImageAttributes类解决,只需设置颜色重映射表。

ColorMap[] maps = new ColorMap[someNum]
//  add mappings
imageAttrs.SetRemapTable(maps);

再次感谢你的帮助,至少我学到了一些东西。