我正在动态地将具有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值,否则结果看起来很糟糕。
答案 0 :(得分:1)
您应该使用Bitmap.LockBits获取指向原始图像数据的指针。然后你只需遍历每个像素并在字典中查找它的颜色。它会超级快。