Search

'프로그래밍'에 해당되는 글 1건

  1. 2010.05.27 [장영수]MFC-Cimage 1

[장영수]MFC-Cimage

Programming/MFC 2010. 5. 27. 17:11 Posted by 알 수 없는 사용자
cImage 사용하다가 막혀서 불펌 -ㅂ-ㅋㅋ

----

CImage는 MS에서 .net 이후부터 제공되는 그림 관련 클래스임.
이전 CBitmap의 bmp만 다루던거에서 좀더 확장하여 Png, Jpg, gif등 다양한 포멧을 지원한다.

기본적으로 사용은
CImage image; 로 한다.

CImage는 일종의 스케치북으로 볼수 있다.

사용법으로
CImage.Create(width, height, bpp); 로 새 스케치북을 만드거나
CImage.Load(CString("filename")); 으로 파일을 받아올수 있다.

이렇게 만들어진것중에서 자주 사용하는 매소드로
BitBlt ... : 기본 API 이다.
사용법은
CImage image;
image.Load("test.jpg");
image.BitBlt(pDC, 0, 0);

이러면 pDC의 0,0 지점에 test.jpg 그림이 복사된다.
좀더 응용하면

CImage a,b;
a.Load("test.jpg");
b.Create(a.GetWidth(), a.GetHeight(), a.GetBPP());
a.BitBlt(b.GetDC(), 0, 0);
b.ReleaseDC();

이렇게 하면 b에 a의 그림이 복사된다.
중요 포인트는 GetDC()를 해준뒤 바로 ReleaseDC를 해줘야 한다.

나머지 대충 사용하면되고..

GetPixel의 경우..
GetPixel과 SetPixel을 그대로 사용하는건 정말 CPU혹사시키는 짓이다.
다음 함수로 대체 하는것이 좋다

// SetPixel 대용
void PointColor(CImage *image, int x, int y, COLORREF c)
{
 // m_image.SetPixel() call ::SetPixel() which is too slow
 // since it has to work with all DCs.

 BYTE *p = (BYTE*)image->GetPixelAddress(x, y);
 if (m_nBitDepth == 16) {
  *(WORD *)p = (WORD)(((c&0xf80000) >> 19) | ((c&0xf800) >> 6) | ((c&0xf8) << 7));
 }
 else {
  *p++ = GetBValue(c);
  *p++ = GetGValue(c);
  *p = GetRValue(c);
 }
}

// GetPixel 대용
COLORREF GetPointColor(CImage *image, int x, int y)
{
 COLORREF result = *((COLORREF*)image->GetPixelAddress(x,y));

 // 메모리에서 가져올때, blue와 red위치가 바뀌어서 가져와진다
 BYTE r = GetBValue(result);
 BYTE g = GetGValue(result);
 BYTE b = GetRValue(result);
 
 return RGB(r,g,b);
}