2013-07-02 2 views
2

어떻게 CDC에서 CBitmap으로 이미지를 전송할 수 있습니까? 전체적으로 문제 : 커다란 이미지를 CBitmap A.에 저장했습니다.이 이미지의 일부를 벡터로 저장하기위한 CBitmap의 번호로 전송해야합니다. 왜냐하면이 때문에 많은 수의 CDC를 사용할 수 없기 때문입니다. :) 주기에 준비된 CDC를 만들고 (CBitmap A의 필수 부분을 얻습니다) CBitmap x로 전송해야합니다. 어떻게해야합니까? 나는 원본 사진을CDC에서 CBitmap으로 이미지 전송

for (int x=100; x>=0; x-=100) 
    for (int y=100; y>=0; y-=100) 
    { 
     CBitmap *destBitmap = new CBitmap(); 
     destBitmap->CreateCompatibleBitmap(&destDC, 100, 100); 

     CBitmap *oldBitmap = destDC.SelectObject(destBitmap); 

     destDC.BitBlt(0,0,100,100,&SourceDC,x,y,SRCCOPY); 

     pMainDC->BitBlt(x*1.1,y*1.1,100,100,&destDC,0,0,SRCCOPY); 

있어 // 내가 여기에 검은 색 사각형을 가지고 -

m_bitmaps.clear(); 
m_bitmaps.reserve(4); 

CDC SourceDC, destDC; 
SourceDC.CreateCompatibleDC(pMainDC); 
destDC.CreateCompatibleDC(pMainDC); 

CBitmap bmpWhole; // bmp 200*200 
bmpWhole.LoadBitmap(IDB_TEST_BITMAP); 
SourceDC.SelectObject(&bmpWhole); 

//pMainDC->BitBlt(0,0,200,200,&SourceDC,0,0,SRCCOPY); 

가 // 괜찮아요 :

여기 내 코드입니다! - 앞의 코드에 뭔가 문제

 m_bitmaps.push_back(destBitmap); 

     destDC.SelectObject(oldBitmap); 
    } 

bmpWhole.DeleteObject(); 
destDC.DeleteDC(); 
SourceDC.DeleteDC(); 

// 그리고 나중에 CBitmaps 검은 색 사각형


나는 해결책을 찾을 수 있습니다!

벡터

을 CBitmap 구문 분석 및 초기화
m_bitmaps.clear(); 
m_bitmaps.reserve(4); 

CDC SourceDC, destDC; 
SourceDC.CreateCompatibleDC(pMainDC); 

CBitmap bmpWhole; 
bmpWhole.LoadBitmap(IDB_TEST_BITMAP); 
SourceDC.SelectObject(&bmpWhole); 

for (int x=100; x>=0; x-=100) 
    for (int y=100; y>=0; y-=100) 
    { 
     CImage *destImage = new CImage(); 
     destImage->Create(100, 100, 24); 

     destDC.Attach(destImage->GetDC()); 
     destDC.BitBlt(0,0,100,100,&SourceDC,x,y,SRCCOPY); 
     destDC.Detach(); 
     destImage->ReleaseDC(); 

     m_bitmaps.push_back(destImage); 
    } 

bmpWhole.DeleteObject(); 
destDC.DeleteDC(); 
SourceDC.DeleteDC(); 

그리기 :

WORD nShift=0; 
for (auto iter = m_bitmaps.begin(); iter != m_bitmaps.end(); ++iter, nShift+=110) 
{ 
    CBitmap* pBitmap = CBitmap::FromHandle((*iter)->operator HBITMAP()); 

    CDC memDC; 
    memDC.CreateCompatibleDC(pMainDC); 
    memDC.SelectObject(pBitmap); 
    pMainDC->BitBlt(nShift, 0, 100, 100, &memDC, 0, 0, SRCCOPY); 
} 
+0

무엇을 시도 했습니까? CBitmap 개체를 장치 컨텍스트로 선택 했습니까? – 0x499602D2

+0

첫 번째 게시물에 코드를 적어 두었습니다. – Seer

답변

1

가 만든 하나 다른 장치 컨텍스트 하나를 만들고 사용에 대상 비트 맵을 선택 BitBlt을 사용하여 원본 비트 맵의 ​​일부를 복사합니다. 다음은이를 수행하는 방법의 예입니다.

// Create a DC compatible with the display 
// this is used to copy FROM the source bitmap 
sourceDC.CreateDC(NULL); 
sourceDC.SelectObject(&sourceBitmap); 

// Create another device context for the destination bitmap 
destDC.CreateCompatibleDC(&sourceDC); 
for(int i = 0; i < numBitmaps; i++) 
{ 
    // Determine the x, y, sourceX, sourceY, with and height here 
    // ... 

    // create a new bitmap 
    CBitmap *destBitmap = new CBitmap(); 
    destBitmap->CreateCompatibleBitmap(&destDC, width, height); 
    // Select the bitmap into the destination device context 
    CBitmap *oldBitmap = destDC.SelectObject(destBitmap); 

    // copy the bitmap 
    destDC.BitBlt(x, y, width, height, &sourceDC, sourceX, sourceY, SRCCOPY); 

    // add it to the vector  
    bitmapVector.push_back(destBitmap); 

    // Clean up 
    destDC.SelectObject(oldBitmap); 
} 

간결성을 위해 오류 검사는 생략했습니다. C++ 11 또는 Boost를 사용하는 경우 unique_ptr을 사용하여 비트 맵 객체의 수명을 관리하는 것이 좋습니다. 그렇지 않으면 소멸자와 같은 적절한 위치에서 delete해야합니다.

관련 문제