본문 바로가기
프로그래밍/MFC

GDI+ 기반 BMP to JPG

by 완소루피 2020. 11. 12.
728x90
반응형

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);

--------------------------------------------------------------------

http://winapi.co.kr/project/library/gdiplus/1-6.htm

728x90
반응형

'프로그래밍 > 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