본문 바로가기
프로그래밍

[C#]에서 메모리 비트맵의 이미지 이동 [이미지 + 이미지 -> 이미지]

by 건우아빠유리남편 2011. 1. 19.
반응형
실시간 그래프 컨트롤을 새로 제작 하는 도중  이미지 연산이 많아 다른 방법을 생각 할 수밖에 없었다.
다음과 같은 2가지 방법이 있겠다.
1. 새로운 데이터 삽입 시 이전 데이터들을 앞으로 당겨주고 새로운 데이터 삽입 -> 데이터가 많을 수록 무수한 연산 실행
2. 현재 이미지 자체를 앞으로 한칸 당겨 그린다. -> 이미지를 redraw하는 몇번의 연산만 수행

결국 2번 으로 가야 했다.
하지만 문제 발생...
1. DrawImage의 오버로딩중에 (Image, destRect, sourceRect, GraphUnit.Pixcel) -> 요 함수로 자기 자신의 영역을 옮기지 못한다. C++에서는 bitblt로 같은 문제를 해결 할 수 있다. (자신의 이미지도 가능)

기본적으로 C#에서는 bitblt 함수를 쓸 수 없기 때문에 다음과 같이 gdi32.dll에서 import 해서 사용하는 수밖에 없다.
        public enum BITBLT
        {
            SRCCOPY = 0x00CC0020, /* dest = source*/
            SRCPAINT = 0x00EE0086, /* dest = source OR dest*/
            SRCAND = 0x008800C6, /* dest = source AND dest*/
            SRCINVERT = 0x00660046, /* dest = source XOR dest*/
            SRCERASE = 0x00440328, /* dest = source AND (NOT dest )*/
            NOTSRCCOPY = 0x00330008, /* dest = (NOT source)*/
            NOTSRCERASE = 0x001100A6, /* dest = (NOT src) AND (NOT dest) */
            MERGECOPY = 0x00C000CA, /* dest = (source AND pattern)*/
            MERGEPAINT = 0x00BB0226, /* dest = (NOT source) OR dest*/
            PATCOPY = 0x00F00021, /* dest = pattern*/
            PATPAINT = 0x00FB0A09, /* dest = DPSnoo*/
            PATINVERT = 0x005A0049, /* dest = pattern XOR dest*/
            DSTINVERT = 0x00550009, /* dest = (NOT dest)*/
            BLACKNESS = 0x00000042, /* dest = BLACK*/
            WHITENESS = 0x00FF0062, /* dest = WHITE*/
        };

        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern int BitBlt(
            IntPtr hdcDest,     // handle to destination DC (device context)
            int nXDest,         // x-coord of destination upper-left corner
            int nYDest,         // y-coord of destination upper-left corner
            int nWidth,         // width of destination rectangle
            int nHeight,        // height of destination rectangle
            IntPtr hdcSrc,      // handle to source DC
            int nXSrc,          // x-coordinate of source upper-left corner
            int nYSrc,          // y-coordinate of source upper-left corner
            System.Int32 dwRop  // raster operation code
            );

하지만 요 bitblt를 사용하는 방법으로도 해결 되지 않았다. 기껏 해봤드니 왠지 모르겠지만 memoryBitmap의 영역을 그린 부분은 검은색으로 나오는 현상 =_= 왤까...

결국  다음과 같은 방법으로 해결
DrawImage(Image, destRect, sourceRect, GraphUnit.Pixcel) 를 사용 하되,
TempBitmap을 활용한다.


이동할 메모리비트맵의 이미지 -> temp공간에 그림 -> 다시 이동하고자 하는 메모리비트맵에 그림


생각해보면 그리 어려운 짓은 아닌데..-_-;; 몰랐써용

반응형

댓글