繁体   English   中英

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

[英]How to convert a 32bpp image to an indexed format?

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

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

您是否可以创建另一幅图像,将其叠加为受影响的像素为红色,然后同时显示两者?

由于要使亮度大于240,因此可以先将覆盖层转换为灰度,然后转换为索引以获得超亮像素。

标记了违法者后,您无需指定要使用的方法,所以我不知道这是否可行。

听起来像是可以使用像素着色器轻松完成的操作。 即使是非常早期的着色器模型也将支持这种操作。

但是问题是:

可以在您的应用程序中包含着色器支持而不会带来太多麻烦吗?

您知道着色器编程吗?

编辑:

您可能没有3D上下文,可以在其中执行类似= /

我大部分时间只是在发表自己的想法。

用一个CPU逐个像素地处理图像应该是实时的,不是吗?

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

再次编辑:

如果您提供了有关该应用实际功能的更多详细信息,我们可能会提供更多帮助? 例如,如果您要制作一个网络应用程序,那么我的所有技巧都没有道理。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM