2013-07-22 3 views
1

У меня есть два растровых изображения:Объединение двух Gdiplus :: Bitmap в один C++

Gdiplus::Bitmap *pbmBitmap, pbmBitmap1; 

Они содержит два изображения. Как я могу объединить их в одно изображение?

Я пытался что-то вроде этого:

Bitmap* dstBitmap = new Bitmap(pbmBitmap->GetWidth(), pbmBitmap->GetHeight() + pbmBitmap1->GetHeight()); //create dst bitmap 

HDC dcmem = CreateCompatibleDC(NULL); 
SelectObject(dcmem, pbmBitmap); //select first bitmap 

HDC dcmemDst = CreateCompatibleDC(NULL); 
SelectObject(dcmem1, dstBitmap); //select destination bitmap 

BitBlt(dcmemDst em1, 0, 0, pbmBitmap->GetWidth(), pbmBitmap->GetHeight(), dcmem, 0, 0, SRCCOPY); //copy first bitmap into destination bitmap 

HBITMAP CreatedBitmap = CreateCompatibleBitmap(dcmem, pbmBitmap->GetWidth(), pbmBitmap->GetHeight() + pbmBitmap1->GetHeight()); 

dstBitmap = new Bitmap(CreatedBitmap, NULL); 
dstBitmap ->Save(L"omg.bmp", &pngClsid, 0); //pngClsid i took from msdn 

Я знаю - уродливый код, но мне нужно сделать это в C++. Я получаю черное изображение. Зачем?

// EDIT

После двух часов прибегая к помощи и чтение я получил это:

HBITMAP bitmapSource; 
pbmBitmap->GetHBITMAP(Color::White, &bitmapSource); //create HBITMAP from Gdiplus::Bitmap 

HDC dcDestination = CreateCompatibleDC(NULL); //create device contex for our destination bitmap 
HBITMAP HBitmapDestination = CreateCompatibleBitmap(dcDestination, pbmBitmap->GetWidth(), pbmBitmap->GetHeight()); //create HBITMAP with correct size 
SelectObject(dcDestination, dcDestination); //select created hbitmap on our destination dc 

HDC dcSource = CreateCompatibleDC(NULL); //create device contex for our source bitmap 
SelectObject(dcSource, bitmapSource); //select source bitmap on our source dc 

BitBlt(dcDestination, 0, 0, pbmBitmap->GetWidth(), pbmBitmap->GetHeight(), dcSource, 0, 0, SRCCOPY); //copy piece of bitmap with correct size 

SaveBitmap(dcDestination, HBitmapDestination, "OMG.bmp"); //not working i get 24kb bitmap 
//SaveBitmap(dcSource, bitmapSource, "OMG.bmp"); //works like a boss, so it's problem with SaveBitmap function 

Он должен работать, но я получаю 24Kb растрового изображения. SaveBitmap - это моя настраиваемая функция, она работает, когда я пытаюсь сохранить исходный битмап. Почему я не могу скопировать одно растровое изображение в другое?

+0

Где вы загрузки исходного растрового изображения? –

+0

Вы имеете в виду pbmBitmap и pbmBitmap1? Я загружаю их в начале. Они загружаются правильно. Я проверил его, используя save. – Yozer

+0

Прошло довольно много времени с тех пор, как я сделал такие вещи, но я бы предложил проверить результат всех операций (что BitBlt и SelectObject возвращают ненулевое значение, а dcMem и dcMemDst не являются NULL) –

ответ

2

Используйте объект Graphics для их объединения. Вот пример рабочего кода ... Конечно, вы должны использовать smart ptrs как unique_ptr <> вместо new/delete, но я не хотел предполагать, что вы используете VS 2012 или новее.

void CombineImages() 
{ 
    Status rc; 

    CLSID pngClsid; 
    GetEncoderClsid(L"image/png", &pngClsid); 

    Bitmap* bmpSrc1 = Bitmap::FromFile(L"Image1.JPG"); 
    assert(bmpSrc1->GetLastStatus() == Ok); 
    Bitmap* bmpSrc2 = Bitmap::FromFile(L"Image2.JPG"); 
    assert(bmpSrc2->GetLastStatus() == Ok); 

    Bitmap dstBitmap(bmpSrc1->GetWidth(), bmpSrc1->GetHeight() + bmpSrc2->GetHeight()); 
    assert(dstBitmap.GetLastStatus() == Ok); 

    Graphics* g = Graphics::FromImage(&dstBitmap); 
    rc = g->DrawImage(bmpSrc1, 0, 0); 
    assert(rc == Ok); 
    rc = g->DrawImage(bmpSrc2, 0, bmpSrc1->GetHeight()); 
    assert(rc == Ok); 

    rc = dstBitmap.Save(L"Output.png", &pngClsid, NULL); 
    assert(rc == Ok); 

    delete g; 
    delete bmpSrc1; 
    delete bmpSrc2; 
} 

основной п ..

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ULONG_PTR token; 
    GdiplusStartupInput input; 

    GdiplusStartup(&token, &input, nullptr); 
    CombineImages(); 
    GdiplusShutdown(token); 
    return 0; 
} 
Смежные вопросы