使用ImageAttributes.SetRemapTable的大量ColorMaps的性能问题

时间:2009-07-03 08:42:53

标签: c# image gdi+ colors

我正在动态地将具有Alpha透明度的图像中的颜色映射到另一种(较小的一组)颜色。

我的代码如下:

var mappings = new List<ColorMap>();
foreach(var color in mapcolours)
{
    // Add mappings for all alpha values of the mask colour
    for(int i = 0; i < 256; i++)
    {
        var cm = new ColorMap();
        cm.OldColor = Color.FromArgb(i, mapcolour);
        cm.NewColor = Color.FromArgb(i, GetDestinationColour(mapcolour));
        mappings.Add(cm);
    }
}

var ia = new ImageAttributes();
ia.SetRemapTable(mappings.ToArray(), ColorAdjustType.Bitmap);
g.DrawImage(image_mask, destrect, 0, 0, image_mask.Width, image_mask.Height, GraphicsUnit.Pixel, ia);

但遗憾的是(我认为它是因为我映射了每种颜色的所有255个alpha值),这会占用大量的CPU,这些CPU在某些分析过程中已经显示出来。

有没有更有效的方法来实现这一目标?我不能停止映射所有255个alpha值,否则结果看起来很糟糕。

1 个答案:

答案 0 :(得分:1)

您应该使用Bitmap.LockBits获取指向原始图像数据的指针。然后你只需遍历每个像素并在字典中查找它的颜色。它会超级快。