//////////////////////////////////////////////////////////////////////////////////////////// //8bit(256色)グレースケールのPNG画像を生成するプログラム.無劣化でBMPより保存容量を減らせる. //8bitのBMPやPNGは各ピクセルが1byteの容量で済むが,256色分のパレット情報を作成する必要がある. //BMPのパレットはRGBAのうちRGBの情報だけ指定すればよい.(Aは予備で不使用なのでPNGと同じにしておいても問題ない) //PNGのパレットはAに透過情報を入れるので,不透明にするのであれば256色すべてにFFを指定する. //////////////////////////////////////////////////////////////////////////////////////////// #include #include #include #include int main(int, char**) { CLSID id; UINT num = 0; UINT size = 0; UINT palsize; Gdiplus::GdiplusStartupInput input; ULONG_PTR token; Gdiplus::GdiplusStartup(&token, &input, NULL); Gdiplus::GetImageEncodersSize(&num, &size); Gdiplus::ImageCodecInfo *pImageCodecInfo; pImageCodecInfo = new Gdiplus::ImageCodecInfo[size]; Gdiplus::GetImageEncoders(num, size, pImageCodecInfo); //画像情報生成(色0から色255まで横一列に並べる) byte *ImgMem=new BYTE[256 * 64]; for(int x=0; x<256; x++){ for(int y=0; y<64; y++){ ImgMem[x+y*256]=x; } } Gdiplus::Bitmap* image; image = new Gdiplus::Bitmap(256, 64, 256, PixelFormat8bppIndexed, ImgMem); //パレット情報獲得 palsize=image->GetPaletteSize(); Gdiplus::ColorPalette *pal; pal = (Gdiplus::ColorPalette*)new BYTE[palsize]; image->GetPalette(pal, palsize); //BMPで保存 //パレットを作成(色X(Xは0〜255)はRGBがX,X,Xになる.) for(unsigned int i = 0; i < 256; i++){ pal->Entries[i] = i+ (i<<8) + (i<<16);//BMPは4番目のバイトは予備なので指定しなくてよい.(PNGと同じにしても問題ない.) } image->SetPalette(pal); //保存方法をBMPに指定 for (UINT j = 0; j < num; ++j) { if (wcscmp(pImageCodecInfo[j].MimeType, L"image/bmp") ==0) { //保存する画像の形式を選択pngやbmp等も可能 id = pImageCodecInfo[j].Clsid; break; } } image->Save(L"256Gray_test.bmp", &id, NULL); printf("BMPで保存しました\n"); //PNGで保存 //パレットを作成(色X(Xは0〜255)はRGBAがX,X,X,255になる.) for(unsigned int i = 0; i < 256; i++){ pal->Entries[i] = i+ (i<<8) + (i<<16) + (0xFF000000);//PNGは4番目のバイトが透明度(RGBAのA)なのでFFを指定. } image->SetPalette(pal); //保存方法をPNGに指定 for (UINT j = 0; j < num; ++j) { if (wcscmp(pImageCodecInfo[j].MimeType, L"image/png") ==0) { id = pImageCodecInfo[j].Clsid; break; } } image->Save(L"256Gray_test.png", &id, NULL); printf("pngで保存しました\n"); delete [] pImageCodecInfo; delete [] pal; delete image; Gdiplus::GdiplusShutdown(token); delete [] ImgMem; return 0; }