मैं काम कर लगता है कि कोड निर्देश की तुलना में अधिक उपयोगी है, इसलिए:
#include <GdiPlus.h>
#include <memory>
Gdiplus::Status HBitmapToBitmap(HBITMAP source, Gdiplus::PixelFormat pixel_format, Gdiplus::Bitmap** result_out)
{
BITMAP source_info = { 0 };
if(!::GetObject(source, sizeof(source_info), &source_info))
return Gdiplus::GenericError;
Gdiplus::Status s;
std::auto_ptr<Gdiplus::Bitmap> target(new Gdiplus::Bitmap(source_info.bmWidth, source_info.bmHeight, pixel_format));
if(!target.get())
return Gdiplus::OutOfMemory;
if((s = target->GetLastStatus()) != Gdiplus::Ok)
return s;
Gdiplus::BitmapData target_info;
Gdiplus::Rect rect(0, 0, source_info.bmWidth, source_info.bmHeight);
s = target->LockBits(&rect, Gdiplus::ImageLockModeWrite, pixel_format, &target_info);
if(s != Gdiplus::Ok)
return s;
if(target_info.Stride != source_info.bmWidthBytes)
return Gdiplus::InvalidParameter; // pixel_format is wrong!
CopyMemory(target_info.Scan0, source_info.bmBits, source_info.bmWidthBytes * source_info.bmHeight);
s = target->UnlockBits(&target_info);
if(s != Gdiplus::Ok)
return s;
*result_out = target.release();
return Gdiplus::Ok;
}
स्रोत
2011-05-02 17:09:10
क्या आप वाकई HBITMAP अल्फ़ा चैनल के साथ शुरू करने के लिए है कि के लिए पता है? उदाहरण के लिए, क्या आपने इसे BI_RGB और 32bpp या किसी अन्य तरीके से डीआईबी के रूप में बनाया है? –
हां, इसमें पारदर्शिता है। यह :: अल्फाब्लेंड() फ़ंक्शन का उपयोग करके अच्छी तरह से आकर्षित करता है। – mackenir
(मैंने इसे नए बिटमैप (स्ट्रिंग फ़ाइल नाम) और .NET बिटमैप ऑब्जेक्ट पर GetHBitmap() को कॉल करके सी # में बनाया है। – mackenir