Cocreateinstance creates iimagingfactory, then uses createimagefromfile to create the iimage interface, and finally draws the iimage to DC using the draw interface. But the problem is that the draw has not set the transparent attribute? How should I perform this operation? I saw a solution on the Internet. This is to convert the PNG image into a 32-Bit Bitmap and then transparently draw it to the DC. Here is a piece of code that has been successfully debugged:
View plaincopy to clipboardprint?
Hbitmap loadpngimage2 (HDC, lpctstr filename)
{
Iimagingfactory * pimagefactory = 0;
Iimage * pimage = 0;
Imageinfo;
Coinitializeex (0, coinit_multithreaded );
Hbitmap = 0;
Lpbyte;
If (succeeded (cocreateinstance (clsid_imagingfactory, 0, clsctx_inproc_server, iid_iimagingfactory, (void **) & pimagefactory )))
{
If (succeeded (pimagefactory-> createimagefromfile (filename, & pimage) & succeeded (pimage-> getimageinfo (& imageinfo )))
{
Hdc bmp Dc = createcompatibledc (HDC );
// Lpbyte;
Bitmapinfo * pbinfo;
Pbinfo = (bitmapinfo *) calloc (1, sizeof (bitmapinfo) + 4 * sizeof (INT ));
If (! Pbinfo)
Return false;
Pbinfo-> bmiheader. bisize = sizeof (bitmapinfoheader );
Pbinfo-> bmiheader. biwidth = imageinfo. width;
Pbinfo-> bmiheader. biheight = imageinfo. height;
Pbinfo-> bmiheader. biplanes = 1;
Pbinfo-> bmiheader. bibitcount = 32;
Pbinfo-> bmiheader. bicompression = bi_alphabitfields;
Pbinfo-> bmiheader. bisizeimage = 0;
Pbinfo-> bmiheader. bixpelspermeter = 11811;
Pbinfo-> bmiheader. biypelspermeter = 11811;
Pbinfo-> bmiheader. biclrused = 0;
Pbinfo-> bmiheader. biclrimportant = 0;
Int * pmask = (int *) & (pbinfo-> bmicolors [0]);
* Pmask ++ = 0x00ff0000;
* Pmask ++ = 0x0000ff00;
* Pmask ++ = 0x000000ff;
* Pmask ++ = 0xff000000;
Hbitmap = createdibsection (null, pbinfo, dib_rgb_colors, (void **) & lpbyte, null, 0 );
Free (pbinfo );
If (! Hbitmap |! Lpbyte)
Return false;
Rect = {0, 0, imageinfo. Width, imageinfo. Height };
Ibitmapimage * pbitmapimage;
Bitmapdata;
Bitmapdata. width = imageinfo. width;
Bitmapdata. Height = imageinfo. height;
Bitmapdata. pixelformat = imageinfo. pixelformat;
Pbitmapimage = NULL;
Pimagefactory-> createbitmapfromimage (pimage, imageinfo. Width, imageinfo. Height, pixfmt_32bpp_argb,
Interpolationhintdefault, & pbitmapimage );
Pbitmapimage-> lockbits (& rect, imagelockmoderead, pixfmt_32bpp_argb, & bitmapdata );
// Transferring the pixels
Memcpy (lpbyte, bitmapdata. scan0, imageinfo. Width * imageinfo. Height * 4 );
Pbitmapimage-> unlockbits (& bitmapdata );
Pbitmapimage-> release ();
Pimage-> release ();
Deletedc (bmp dc );
}
Pimagefactory-> release ();
}
Couninitialize ();
// Processthepixelswithalphachannel here
// Vertical flip and processthepixelswithalphachannel here
For (uint y = 0; y <imageinfo. Height/2; y ++)
{
Byte * ppixel = (byte *) lpbyte + imageinfo. Width * 4 * Y;
Byte * pdstpixel = (byte *) lpbyte + imageinfo. Width * 4 * (imageinfo. Height-y-1 );
For (uint x = 0; x <imageinfo. width; X ++)
{
Ppixel [0] = ppixel [0] * ppixel [3]/255;
Ppixel [1] = ppixel [1] * ppixel [3]/255;
Ppixel [2] = ppixel [2] * ppixel [3]/255;
Pdstpixel [0] = pdstpixel [0] * pdstpixel [3]/255;
Pdstpixel [1] = pdstpixel [1] * pdstpixel [3]/255;
Pdstpixel [2] = pdstpixel [2] * pdstpixel [3]/255;
Int * porigin = (int *) ppixel;
Int * pdst = (int *) pdstpixel;
Int temp = * porigin;
* Porigin = * pdst;
* Pdst = temp;
Ppixel + = 4;
Pdstpixel + = 4;
}
}
Return hbitmap;
}
Hbitmap loadpngimage2 (HDC, lpctstr filename)
{
Iimagingfactory * pimagefactory = 0;
Iimage * pimage = 0;
Imageinfo;
Coinitializeex (0, coinit_multithreaded );
Hbitmap = 0;
Lpbyte;
If (succeeded (cocreateinstance (clsid_imagingfactory, 0, clsctx_inproc_server, iid_iimagingfactory, (void **) & pimagefactory )))
{
If (succeeded (pimagefactory-> createimagefromfile (filename, & pimage) & succeeded (pimage-> getimageinfo (& imageinfo )))
{
Hdc bmp Dc = createcompatibledc (HDC );
// Lpbyte;
Bitmapinfo * pbinfo;
Pbinfo = (bitmapinfo *) calloc (1, sizeof (bitmapinfo) + 4 * sizeof (INT ));
If (! Pbinfo)
Return false;
Pbinfo-> bmiheader. bisize = sizeof (bitmapinfoheader );
Pbinfo-> bmiheader. biwidth = imageinfo. width;
Pbinfo-> bmiheader. biheight = imageinfo. height;
Pbinfo-> bmiheader. biplanes = 1;
Pbinfo-> bmiheader. bibitcount = 32;
Pbinfo-> bmiheader. bicompression = bi_alphabitfields;
Pbinfo-> bmiheader. bisizeimage = 0;
Pbinfo-> bmiheader. bixpelspermeter = 11811;
Pbinfo-> bmiheader. biypelspermeter = 11811;
Pbinfo-> bmiheader. biclrused = 0;
Pbinfo-> bmiheader. biclrimportant = 0;
Int * pmask = (int *) & (pbinfo-> bmicolors [0]);
* Pmask ++ = 0x00ff0000;
* Pmask ++ = 0x0000ff00;
* Pmask ++ = 0x000000ff;
* Pmask ++ = 0xff000000;
Hbitmap = createdibsection (null, pbinfo, dib_rgb_colors, (void **) & lpbyte, null, 0 );
Free (pbinfo );
If (! Hbitmap |! Lpbyte)
Return false;
Rect = {0, 0, imageinfo. Width, imageinfo. Height };
Ibitmapimage * pbitmapimage;
Bitmapdata;
Bitmapdata. width = imageinfo. width;
Bitmapdata. Height = imageinfo. height;
Bitmapdata. pixelformat = imageinfo. pixelformat;
Pbitmapimage = NULL;
Pimagefactory-> createbitmapfromimage (pimage, imageinfo. Width, imageinfo. Height, pixfmt_32bpp_argb,
Interpolationhintdefault, & pbitmapimage );
Pbitmapimage-> lockbits (& rect, imagelockmoderead, pixfmt_32bpp_argb, & bitmapdata );
// Transferring the pixels
Memcpy (lpbyte, bitmapdata. scan0, imageinfo. Width * imageinfo. Height * 4 );
Pbitmapimage-> unlockbits (& bitmapdata );
Pbitmapimage-> release ();
Pimage-> release ();
Deletedc (bmp dc );
}
Pimagefactory-> release ();
}
Couninitialize ();
// Processthepixelswithalphachannel here
// Vertical flip and processthepixelswithalphachannel here
For (uint y = 0; y <imageinfo. Height/2; y ++)
{
Byte * ppixel = (byte *) lpbyte + imageinfo. Width * 4 * Y;
Byte * pdstpixel = (byte *) lpbyte + imageinfo. Width * 4 * (imageinfo. Height-y-1 );
For (uint x = 0; x <imageinfo. width; X ++)
{
Ppixel [0] = ppixel [0] * ppixel [3]/255;
Ppixel [1] = ppixel [1] * ppixel [3]/255;
Ppixel [2] = ppixel [2] * ppixel [3]/255;
Pdstpixel [0] = pdstpixel [0] * pdstpixel [3]/255;
Pdstpixel [1] = pdstpixel [1] * pdstpixel [3]/255;
Pdstpixel [2] = pdstpixel [2] * pdstpixel [3]/255;
Int * porigin = (int *) ppixel;
Int * pdst = (int *) pdstpixel;
Int temp = * porigin;
* Porigin = * pdst;
* Pdst = temp;
Ppixel + = 4;
Pdstpixel + = 4;
}
}
Return hbitmap;
}
Similar source code can be found in a post on the msdn forum. but not very complete and correct. some corrections are made here. skip the previous processes, but looking at the for loop at the end, we actually made a vertical 180-degree flip. this means that the interface memcpy used to copy the previous image pixel information is actually flipped, which is reflected in many camera frames.
This article from the csdn blog, reproduced please indicate the source: http://blog.csdn.net/hhygcy/archive/2009/04/29/4138195.aspx