2

所以这里是详细信息(我使用的是 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 的所有像素都涂成红色。我在想,预先为位图定义一个调色板将是一种干净的方式。

4

3 回答 3

1

从 32bpp 索引到 8bpp 索引几乎总是会导致质量损失,除非原始图像总共少于 256 种颜色。

您能否创建另一个图像,该图像是受影响像素为红色的叠加图像,然后显示这两个图像?

由于您要获得 > 240 的亮度,因此您可以先将叠加层转换为灰度,然后再进行索引以获得过亮像素。

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

于 2009-02-23T21:04:52.660 回答
0

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

然而问题是:

你能在你的应用程序中包含着色器支持而不用太麻烦吗?

你知道着色器编程吗?

编辑:

你可能没有 3D 上下文可以做这样的事情 =/

我主要是在表达我的想法。

一个像素一个像素地处理图片应该可以用一个 CPU 实时完成,不是吗?

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

再次编辑:

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

于 2009-02-23T21:02:43.210 回答
0

感谢大家的帮助。似乎这可以使用 ImageAttributes 类并简单地设置颜色重映射表来解决。

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

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

于 2009-02-24T00:18:47.840 回答