GDI+ 왜 Wide char 쓰냐 == TCHAR 랑 변환하다가 귀찮아서 안했다.
MultibyteToWideChar 함수 써야되는데.. 흠
결국 해결은 CTonyJpegEncoder 씀!!
-----------------------------------------------------------------------------
출처 :http://cafe.naver.com/cyberzone.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=193
Scribble 예제는 다들 아시겠지만
마우스로 슥슥 그림 그리는 기능을 보여주는 예제입니다.
자세한 내용은 강좌란을 참고하세요.
수정된 부분은 다음과 같습니다.
1) stdafx.h에서 다음 내용 추가.
#include <gdiplus.h>
2) APP 클래스에 멤버 변수 추가
ULONG_PTR m_gdiplusToken;
3) InitInstance() 수정
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
4) ExitInstance() 오버라이드하여 수정
Gdiplus::GdiplusShutdown(m_gdiplusToken);
그리고 툴바에 JPG라는 버튼 추가.
JPG 툴바 버튼을 누르면 현재 뷰의 내용을 BitBlt으로 복사하여 CBitmap 생성.
그런 다음 ImageFormat 클래스를 이용하여 JPG로 변환 저장.
다음은 JPG 단추 핸들러입니다.
void CScribbleView::OnSaveasJpg()
{
CDC memDC;
memDC.CreateCompatibleDC(NULL);
CBitmap bitmap;
bitmap.CreateBitmap(GetWidth(), GetHeight(),
memDC.GetDeviceCaps(PLANES),
memDC.GetDeviceCaps(BITSPIXEL),NULL);
CBitmap* pOldBmp=memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, GetWidth(), GetHeight(),
NULL, 0, 0, SRCCOPY);
HBITMAP hBmp;
hBmp=CreateDIBitmap(memDC.m_hDC,
GetBitmapHeaderInfoAddr(),
CBM_INIT,
GetDibBitsAddr(),
GetBitmapInfoAddr(),
DIB_RGB_COLORS);
ImageFormatPtr img = ImageFormat::create();
img->loadAndSaveAs((HBITMAP)bitmap, 0, L"jpg", L"test.jpg");
}
===================================================================================
출처 : http://icarosss.egloos.com/1191615
HBITMAP 으로 부터 JPEG으로 변환을 하고 싶을 경우가 있다.
본인은 캡쳐장치로 부터 이미지를 받아서 편집작업을 하고 그 영상을 캡쳐또는 녹화할때 편집작업을 GDI+를 이용해서 구현하였다.
카메라로부터 들어오는 이미지 스트림을 memory DC에 그리고 그 DC를 비트맵화 하면 HBITMAP을 얻을 수 있다.
여기서 얻은 HBITMAP을 JPEG으로 변환 해보자.
// HBITMAP을 가져옴
Bitmap *bit = Bitmap::FromHBITMAP(hBitmap, 0); // 2번째 파라미터는 0으로 해도 무방하다.
위의 두번째 파라미터때문에 고민 많이 했었는데 무방하다고 판단하였다..^^;;
Bitmap을 생성했으면 압축 Encoder를 가져와야 하는데 다음 함수로 한번에 해결된다.
BOOL GetEncCLSID(WCHAR *mime, CLSID *pClsid)
{
UINT num,size,i;
ImageCodecInfo *arCod;
BOOL bFound=FALSE;
GetImageEncodersSize(&num,&size);
arCod=(ImageCodecInfo *)malloc(size);
GetImageEncoders(num,size,arCod);
for (i=0;i<num;i++) {
if(wcscmp(arCod[i].MimeType,mime)==0) {
*pClsid=arCod[i].Clsid;
bFound=TRUE;
break;
}
}
free(arCod);
return bFound;
}
CLSID Clsid;
GetEncCLSID(L"image/jpeg",&Clsid); // 1번 파라미터를 바꿔주면 어떤포멧으로도 변환 가능하다.
위함수로 얻은 Clsid를 이용해 비트맵을 저장하면 완료
// Save File
Status s = bit->Save(wszPath, &Clsid);
--------------------------------------------------------------------
'프로그래밍 > MFC' 카테고리의 다른 글
Raw to BMP 저장 (0) | 2020.11.13 |
---|---|
Raw to BMP 설명 (0) | 2020.11.12 |
BMP 저장 (0) | 2020.11.12 |
Socket Error Code (0) | 2020.11.12 |
UDP 소켓 통신 (0) | 2020.11.12 |