2009-07-03 2 views
0

알파 투명도가 적용된 이미지에서 색상을 다른 색상 (더 작은 색상)으로 동적으로 매핑합니다.ImageAttributes.SetRemapTable을 사용하여 많은 수의 ColorMaps에서 성능 문제가 발생했습니다.

나는 코드를 같이있어 : 불행하게도

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

관련 문제