【发布时间】:2013-07-22 20:32:35
【问题描述】:
我有两个位图:
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++ 来做。 我得到黑色图像。为什么?
//编辑
在谷歌搜索和阅读两个小时后,我得到了这个:
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 是我的自定义函数,当我尝试保存源位图时它可以工作。 为什么我不能将一个位图复制到另一个位图??
【问题讨论】:
-
你在哪里加载原始位图?
-
你的意思是pbmBitmap和pbmBitmap1?我一开始就加载它们。它们已正确加载。我使用保存检查了它。
-
我已经有一段时间没有做这种事情了,但我建议检查所有操作的结果(BitBlt 和 SelectObject 返回非零并且 dcMem 和 dcMemDst 不为 NULL)
-
看看我的编辑。我检查了每个电话。 SelectObject 返回的不是 NULL,所有 dc 也不是 NULL。 BitBlt 返回 TRUE。