2009-07-03 7 views
0

私は、アルファ透明度を持つイメージの色を別の(より小さな色の)色に動的にマッピングしています。ImageAttributes.SetRemapTableを使用した多数のColorMapでのパフォーマンスの問題

私はのようなコードを持っている:

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個のアルファ値をマッピングしていますので、思う)これは中にまで示してきたCPUの多くを食べますいくつかのプロファイリング。

もっと効率的な方法がありますか?私はすべての255のアルファ値をマッピングするのを止めることができません。さもなければ結果はひどく見えます。

答えて

1

Bitmap.LockBitsを使用して生画像データへのポインタを取得する必要があります。次に、各ピクセルをループし、辞書でその色をルックアップします。超高速です。

+0

gdiマッピングより高速であるかどうかはわかりません。テストする必要があります。 – arbiter

関連する問題