• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:GDI+の使用方法について)

GDI+の使用方法について

このQ&Aのポイント
  • VC++2010でWin32アプリケーションを作成中の方に質問です。GDI+の使用方法について教えてください。
  • Bitmapのクローンを作成する際、PixelFormatを指定する方法がわかりません。どのように定義すれば良いでしょうか?
  • また、System.Drawing名前空間の参照方法についても教えていただけますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • FAY
  • ベストアンサー率49% (95/193)
回答No.2

VC++で組む場合は.NET Frameworkで組むのとはちょっと違うんですよ。 ごっちゃにすると混乱します。 > PixelFormatはDontcareにしたいのですが、PixelFormatはINT型になってしまっているらしく PixelFormat pf = PixelFormatDontCare; です。 SDKのヘッダファイルを漁るとGdiPlusPixelFormats.hの中で#defineされてたりします。 BitmapのCloneはGdiPlusBitmapに定義されている通り inline Bitmap* Bitmap::Clone(IN const Rect& rect, IN PixelFormat format); なので (中略) // namespace使ってればGdiplus::は不要 Rect rect( 0, 0, nImageWidth, nImageHeight); PixelFormat format = PixelFormatDontCare; pBitmap1 = Bitmap2.Clone(rect, format); (以下略) かな。

scanfprintf
質問者

お礼

おそくなり申し訳ございません。 仰っていただいたとおり、.NET Frameworkと混同しておりました。 (そのような気はしていたのですが・・・) PixelFormatDontCareと書けばいいですね、これでなんとかCloneは 使えそうです。日本語のヘルプもしくは、参考サイトなどが あればいいですが・・・ 的確なご回答ありがとうございます。

その他の回答 (1)

  • sygh
  • ベストアンサー率76% (42/55)
回答No.1

サンプルを示します。Rectオーバーロード版も同様です。 なお、ネイティブC++(Win32)用のGDI+は、.NETのSystem.Drawing以下のライブラリとよく似ているけれど違います。 MSDNのヘルプも英語しかありません。 http://msdn.microsoft.com/en-us/library/ms536305.aspx #include <Windows.h> #include <GdiPlus.h> #include <memory> #include <cstdio> #include <clocale> #include <conio.h> #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<ImageCodecInfo*>(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<Bitmap> 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(); }

scanfprintf
質問者

お礼

お礼が遅くなり大変申し訳ございません。 詳細なコードまで記載いただきありがとうございます。 やはり英語のヘルプしかないんですね。 書籍を用意するしかないですかね・・・・・ 大変参考になりました。

関連するQ&A