代码之家  ›  专栏  ›  技术社区  ›  Ed Swangren

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

  •  2
  • Ed Swangren  · 技术社区  · 16 年前

    下面是详细信息(我使用的是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对象来实现这一点。

    当用户调整跟踪条时,我调整矩阵。这不提供每像素的信息,但性能非常好。我 能够 在这里使用锁位和一些不安全的代码,但如果可能的话,我不想重写它。创建新图像时,我希望将亮度值为>240的所有像素都染成红色。我在想,为前面的位图定义一个调色板是一种干净的方法。

    3 回复  |  直到 12 年前
        1
  •  1
  •   Moose    16 年前

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

    你能创建另一个图像,用受影响的像素红色覆盖,然后显示这两个图像吗?

    因为您要使用亮度>240,所以可以先将覆盖转换为灰度,然后再转换为索引,以获得右上角的像素。

    一旦你给罪犯贴上标签,你就不会具体说明你在用它做什么,所以我不知道这是否有效。

        2
  •  0
  •   Nailer    16 年前

    听起来像是用像素遮影器可以很容易做到的事情。即使是早期的着色模型也会支持这样简单的操作。

    然而,问题是:

    您是否可以在应用程序中包含着色器支持而不必太仓促?

    你知道着色编程吗?

    编辑:

    你可能没有一个3D环境,在那里你可以做这样的事情。=/

    我只不过是在表达我的想法。

    一个像素一个像素地操作图片像素应该可以用一个CPU实时操作,不是吗?

    如果没有,请查看GPGPU编程并打开cl。

    再次编辑:

    如果你提供更多关于这个应用程序的细节,我们可能会提供更多帮助?例如,如果你正在制作一个网络应用,我的任何提示都没有意义。

        3
  •  0
  •   Ed Swangren    16 年前

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

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

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