質問者
bmpから透過情報を持ったPNGへの変換

質問
すべての返信
-
Graphics のインスタンスを作成する時に Image を渡すと良いようです。(細かなところは、かなり適当なのですが)次のようなコードでテストしました。
int
iTest3 (void)
{
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;Gdiplus::Bitmap* bitmap = NULL ;
Gdiplus::Image* pNewImage = NULL ;
Gdiplus::Color col ;
Gdiplus::ColorMap* pMap ;
Gdiplus::ImageAttributes* pImageAttr ;
Gdiplus::Graphics* pGraphics ;
UINT x, y, i ;if (Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) != Gdiplus::Ok) {
_ftprintf (stderr, TEXT ("GdiplusStartup failed.\n")) ;
return -1 ;
}
bitmap = new Gdiplus::Bitmap (L"test.bmp", true) ;
if (bitmap != NULL) {
UINT num; // number of image encoders
UINT size; // size, in bytes, of the image encoder array
Gdiplus::ImageCodecInfo* pImageCodecInfo;Gdiplus::GetImageEncodersSize (&num, &size) ;
pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size)) ;
Gdiplus::GetImageEncoders (num, size, pImageCodecInfo) ;for(i = 0; i < num ; i ++) {
if (! wcscmp ((pImageCodecInfo + i)->MimeType, L"image/png")) {
break ;
}
}
if (i < num) {
pMap = new Gdiplus::ColorMap ;
pMap->oldColor = Gdiplus::Color::White ;
pMap->newColor = Gdiplus::Color::Transparent ;
pImageAttr = new Gdiplus::ImageAttributes ;
pImageAttr->SetRemapTable (1, pMap) ;
pNewImage = new Gdiplus::Bitmap (bitmap->GetWidth (), bitmap->GetHeight (), PixelFormat32bppARGB) ;
pGraphics = new Gdiplus::Graphics (pNewImage) ;
pGraphics->Clear (Gdiplus::Color::Transparent) ;
pGraphics->DrawImage (bitmap, Gdiplus::RectF (0, 0, bitmap->GetWidth (), bitmap->GetHeight ()), 0, 0, bitmap->GetWidth (), bitmap->GetHeight (), Gdiplus::UnitPixel, pImageAttr) ;
pNewImage->Save (L"test.png", &(pImageCodecInfo + i)->Clsid) ;
}
free(pImageCodecInfo) ;
delete bitmap ;
bitmap = NULL ;
}
if (pNewImage != NULL)
delete pNewImage ;
if (pGraphics != NULL)
delete pGraphics ;
Gdiplus::GdiplusShutdown (gdiplusToken) ;
return 0 ;
}