使用颜色重新映射表
重映射是根据颜色重映射表转换图像中的颜色的过程。 颜色重映射表是 ColorMap 结构的数组。 数组中的每个 ColorMap 结构都有一个 oldColor 成员和一个 newColor 成员。
当 GDI+ 绘制图像时,会将图像的每个像素与旧的颜色数组进行比较。 如果像素的颜色与旧的颜色匹配,则其颜色将更改为相应的新颜色。 颜色仅在呈现时更改 - 图像本身的颜色值 (存储在 Image 或 Bitmap 对象) 不会更改。
若要绘制重新映射的图像,请初始化 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);
下图左侧显示原始图像,右侧显示重映射后的图像。