【问题标题】:Performance problem with large number of ColorMaps with ImageAttributes.SetRemapTable使用 ImageAttributes.SetRemapTable 的大量 ColorMap 的性能问题
【发布时间】:2010-11-07 21:12:15
【问题描述】:

我正在将具有 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 值,否则结果看起来很糟糕。

【问题讨论】:

    标签: c# image gdi+ colors


    【解决方案1】:

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

    【讨论】:

    • 不确定这会比 gdi 映射更快。需要测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多