2010-03-19 2 views
0

필자는이 호출을 고압 기능에서 병목 현상으로 확인했습니다.투명 비트 블렌드를 사용하여 작은 비트 맵을 큰 비트 맵에 복사 : graphics.DrawImage (smallBitmap, x, y)보다 빠른 것?

graphics.DrawImage(smallBitmap, x , y); 

작은 반투명 비트 맵을 더 큰 반투명 비트 맵으로 블렌드하는 더 빠른 방법이 있습니까?

사용 예 :

XY[] locations = GetLocs(); 
    Bitmap[] bitmaps = GetBmps(); //small images sizes vary approx 30px x 30px 

     using (Bitmap large = new Bitmap(500, 500, PixelFormat.Format32bppPArgb)) 
     using (Graphics largeGraphics = Graphics.FromImage(large)) 
     { 
      for(var i=0; i < largeNumber; i++) 
      { 
      //this is the bottleneck 
      largeGraphics.DrawImage(bitmaps[i], locations[i].x , locations[i].y); 
     } 
     } 

     var done = new MemoryStream(); 
     large.Save(done, ImageFormat.Png); 
     done.Position = 0; 
     return (done); 

의 drawImage 호출 변화 위치에서 큰 비트 맵으로 작은 32bppPArgb 비트 맵을 복사들을 가지고 작은 비트 맵 일부만 큰 비트 맵을 보이는 영역을 겹칠 수있다. 두 이미지 모두 출력에 중요한 방식으로 DrawImage와 블렌딩되는 반투명 내용을 포함합니다. BitBlt로 테스트를 해봤지만 상당한 속도 향상을 보지 못했으며 테스트에서 알파 블렌딩이 동일하게 나오지 않았습니다. bitblt 또는 안전하지 않은 C# 코드에 대한 더 나은 호출을 포함하여 모든 메서드에 대해 열려 있습니다.

+1

저는 실제로 그렇게 생각하지 않습니다 (하드웨어 가속을 사용하지 않고, 아마 DirectX가 여기에 도움이 될 수 있습니다). 나는 비슷한 문제를 가지고 놀고 있었다. 반투명 한 이미지를 * 불투명 한 * 이미지 위에 칠한 어셈블러에서 좀 더 빠른 DrawImage를 작성할 수 있다는 것을 알게되었습니다. –

+0

나는 그것을 두려워했다. 나는 코드가 웹 서버에서 실행되기 때문에 DirectX가 아마 나를위한 것이라고 생각한다. 안전하지 않은 int 배열에서 비트 연산자를 사용하여 블렌딩을 시도 했습니까? 그게 내가 시도한 한 가지지만, 유스 케이스로 테스트 할 수 있도록 설정하는 것은 상당한 양의 일이 될 것이고, 테스트 케이스를 만들지 않으려 고 노력하고 싶을 것이다. 의견을 보내 주셔서 감사합니다. – Glenn

+0

Dan, 몇 가지 테스트를 마친 후, 나는 당신이 옳다고 생각합니다. 답변을 아래에 귀하의 의견을 게시하면 나는 그것을 허용으로 표시합니다. – Glenn

답변

0

약간의 테스트 후에 나는 Dan이 옳았다는 것을 알 수 있습니다 (위의 주석 참조). 그것이 제공하는 모든 블렌딩 기능이 필요하지 않다면 GDI Draw Image 성능을 이길 수는 있지만, 투명성 블렌드의 경우 재료 개선의 여지가 없다고 생각합니다.

관련 문제