PNG格式的圖片是支持透明通道的,BMP格式的圖片是沒有透明通道的,所以當PNG格式的圖片轉換為BMP格式時,對於PNG圖片的透明背景就需要進行特別的處理。
VC++中的HBITMAP是支持透明色的,如果HBITMAP是PNG格式圖片的句柄,使用CImage:Save或其它方式保存到文件時,透明背景會變成黑色。
解決這個問題可以用GDI+、LIBPNG等,最簡單的方式是使用CImage,直接將圖像數據中的透明部分替換為白色或其他顏色。
優點:處理方法簡單,效率高,只需CImage;
缺點:在圖片拐角處產生略微鋸齒;
貼出我寫的函數,大家可以結合自己的需要決定是否使用:
HBITMAP TransparentImage(HBITMAP hBitmap) { CImage Image; Image.Attach(hBitmap); int nPitch = Image.GetPitch( ) , nBPP = Image.GetBPP( ); LPBYTE lpBits = reinterpret_cast< LPBYTE>( Image.GetBits( ) ); for( int yPos = 0 ; yPos < Image.GetHeight( ) ; yPos ++ ) { LPBYTE lpBytes = lpBits + ( yPos * nPitch ); PDWORD lpLines = reinterpret_cast< PDWORD >( lpBytes ); for( int xPos = 0 ; xPos < Image.GetWidth( ) ; xPos ++ ) { if( nBPP == 32 && lpLines[ xPos ] >> 24 != 0x000000FF) { lpLines[ xPos ] |= 0xFFFFFFFF ; } } } return Image.Detach(); }
lpLines[ xPos ] |= 0xFFFFFFFF為要替換成的顏色,設置為自定義顏色值即可。
記錄,為更好的自己!