質問: gdi+の使用方法について 現在vc++2010でwin32アプリケーションを作成していて、 最近gdi+の使用を試みているのですが・・・・ bitmapのクローンを作成する場合に、pixelformatを指定するとことですが、 pixelformatはどのように定義するのでしょうか? gdiplus::rect *rect=new gdiplus::rect(0,0,orgrect.right,orgrect.bottom); pixelformat pf; bitmap1=bitmap2->clone(rect,pf.); とすると構文のエラーになってしまいます。 pixelformatはdontcareにしたいのですが、pixelformatはint型になってしまっているらしく pf.dontcareなどもできません。 そもそも、msdnを確認していると、名前空間:system.drawingとありますが、 名前空間にusing system.drawing;と記述すると「systemが定義されていません」 となっています。ファイルの参照?というものが必要なのでしょうか? bitmap1からbitmap2へコピーする場合(クローンを作成する場合)は 実際どのように書けばいいのでしょうか? 質問内容がゴチャゴチャして申し訳ございません。 初歩的な質問で大変恐縮ですが、ご教示願います。
回答: サンプルを示します。rectオーバーロード版も同様です。 なお、ネイティブc++(win32)用のgdi+は、.netのsystem.drawing以下のライブラリとよく似ているけれど違います。 msdnのヘルプも英語しかありません。 http://msdn.microsoft.com/en-us/library/ms536305.aspx #include #include #include #include #include #include #pragma comment(lib, "gdiplus") // 簡単のため。できるかぎり完全名を使用することを推奨。 using namespace gdiplus; class myencoders { uint m_encodernum; imagecodecinfo* m_pencodersarray; public: myencoders() : m_encodernum() , m_pencodersarray() { uint size = 0; getimageencoderssize(&m_encodernum, &size); m_pencodersarray = reinterpret_cast(malloc(size)); getimageencoders(m_encodernum, size, m_pencodersarray); } ~myencoders() { free(m_pencodersarray); } const imagecodecinfo* getencoderbymimetype(lpcwstr pname) const { for (uint i = 0; i < m_encodernum; ++i) { if (wcscmp(m_pencodersarray[i].mimetype, pname) == 0) { return &m_pencodersarray[i]; } } return null; } }; // スマート ポインタ型。 typedef std::tr1::shared_ptr tbitmapptr; void printbitmapinfo(lpcwstr pbmpfilepath, bitmap& bmp) { wprintf(l"filepath = [%s], width = %u, height = %u, pixelformat = 0x%x (%u bpp)\n", pbmpfilepath, bmp.getwidth(), bmp.getheight(), bmp.getpixelformat(), getpixelformatsize(bmp.getpixelformat())); } void main() { _wsetlocale(lc_all, l""); ulong_ptr gdiptoken = 0; gdiplusstartupinput startupinput; gdiplusstartup(&gdiptoken, &startupinput, null); { myencoders encoders; lpcwstr psrcbmpfilepath = l"test.jpg"; lpcwstr pdstbmpfilepath = l"test.png"; bitmap src(psrcbmpfilepath); if (src.getlaststatus() == ok) { printbitmapinfo(psrcbmpfilepath, src); tbitmapptr pbmp(src.clone(0, 0, src.getwidth(), src.getheight(), src.getpixelformat())); if (pbmp->save(pdstbmpfilepath, &encoders.getencoderbymimetype(l"image/png")->clsid) == ok) { printbitmapinfo(pdstbmpfilepath, *pbmp); } else { wprintf(l"failed to save the image! [%s]\n", pdstbmpfilepath); } } } gdiplusshutdown(gdiptoken); puts("press any..."); _getch(); }