使用颜色重新映射表

重映射是根据颜色重映射表转换图像中的颜色的过程。 颜色重映射表是 ColorMap 结构的数组。 数组中的每个 ColorMap 结构都有一个 oldColor 成员和一个 newColor 成员。

当 GDI+ 绘制图像时,会将图像的每个像素与旧的颜色数组进行比较。 如果像素的颜色与旧的颜色匹配,则其颜色将更改为相应的新颜色。 颜色仅在呈现时更改 - 图像本身的颜色值 (存储在 ImageBitmap 对象) 不会更改。

若要绘制重新映射的图像,请初始化 ColorMap 结构的数组。 将该数组的地址传递到 ImageAttributes 对象的 ImageAttributes::SetRemapTable 方法,然后将 ImageAttributes 对象的地址传递给 Graphics 对象的 DrawImage 方法

以下示例从 RemapInput.bmp 文件创建 Image 对象。 该代码创建一个颜色重映射表,该表由单个 ColorMap 结构组成。 ColorMap 结构的 oldColor 成员为红色,newColor 成员为蓝色。 图像在不重映射的情况下绘制一次,在重映射的情况下绘制一次。 重映射过程会将所有红色像素更改为蓝色。

Image            image(L"RemapInput.bmp");
ImageAttributes  imageAttributes;
UINT             width = image.GetWidth();
UINT             height = image.GetHeight();
ColorMap         colorMap[1];

colorMap[0].oldColor = Color(255, 255, 0, 0);  // opaque red
colorMap[0].newColor = Color(255, 0, 0, 255);  // opaque blue

imageAttributes.SetRemapTable(1, colorMap, ColorAdjustTypeBitmap);

graphics.DrawImage(&image, 10, 10, width, height);

graphics.DrawImage(
   &image, 
   Rect(150, 10, width, height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle 
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel,
   &imageAttributes);

下图左侧显示原始图像,右侧显示重映射后的图像。

显示多色图像的两个版本的插图;第一个版本中的红色区域在第二个版本中为蓝色