teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

windows.hが抜けてたので追加

2018/06/11 03:55

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -5,6 +5,7 @@
5
5
  ---
6
6
  GDI+で書いたサンプル
7
7
  ```c++
8
+ #include <windows.h>
8
9
  #include <gdiplus.h>
9
10
  #pragma comment (lib,"gdiplus.lib")
10
11
  using namespace Gdiplus;

1

サンプルコード追加

2018/06/11 03:54

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -1,3 +1,91 @@
1
1
  コンパイルできないとは、具体的にはどのような状況でしょうか?
2
2
  CImageクラスはVS2010でも利用可能です。コンパイルできないとすればそれは何か他に原因があるので、まずはそれを解消すべきでしょう。
3
- 念のため、たまたまVS2010をインストールした環境が手元に残っていたのでリンク先のコード(私が書いたものですが)を試してみましたが、そのままコピペしてビルドできましたし、正しく実行できていました(保存した画像ファイルで確認)。
3
+ 念のため、たまたまVS2010をインストールした環境が手元に残っていたのでリンク先のコード(私が書いたものですが)を試してみましたが、そのままコピペしてビルドできましたし、正しく実行できていました(保存した画像ファイルで確認)。
4
+
5
+ ---
6
+ GDI+で書いたサンプル
7
+ ```c++
8
+ #include <gdiplus.h>
9
+ #pragma comment (lib,"gdiplus.lib")
10
+ using namespace Gdiplus;
11
+
12
+ // クリップボードからビットマップを取得する関数
13
+ void SampleClipboard()
14
+ {
15
+ if(!::IsClipboardFormatAvailable(CF_BITMAP))
16
+ {
17
+ return;
18
+ }
19
+
20
+ if(!::OpenClipboard(NULL))
21
+ {
22
+ return;
23
+ }
24
+
25
+ HBITMAP hBitmap = (HBITMAP)::GetClipboardData(CF_BITMAP);
26
+ if(hBitmap == NULL)
27
+ {
28
+ ::CloseClipboard();
29
+ return;
30
+ }
31
+
32
+ Bitmap* pClip = Bitmap::FromHBITMAP(hBitmap, NULL);
33
+ Bitmap* pBitmap = pClip->Clone(0, 0, pClip->GetWidth(), pClip->GetHeight(), PixelFormat32bppRGB);
34
+ delete pClip;
35
+
36
+ ::CloseClipboard();
37
+
38
+ for(UINT y = 0; y < pBitmap->GetHeight(); y++)
39
+ {
40
+ for(UINT x = 0; x < pBitmap->GetWidth(); x++)
41
+ {
42
+ Color color;
43
+ pBitmap->GetPixel(x, y, &color);
44
+ BYTE r = color.GetR();
45
+ BYTE g = color.GetG();
46
+ BYTE b = color.GetB();
47
+
48
+ // 何かの処理
49
+ }
50
+ }
51
+
52
+ // 保存はCImageほど簡単ではない
53
+ UINT numEncoders;
54
+ UINT size;
55
+ GetImageEncodersSize(&numEncoders, &size);
56
+ ImageCodecInfo* pCodecs = (ImageCodecInfo*)malloc(size);
57
+ GetImageEncoders(numEncoders, size, pCodecs);
58
+ ImageCodecInfo* pPngCodec = NULL;
59
+ for(UINT i = 0; i < numEncoders; i++)
60
+ {
61
+ ImageCodecInfo* pCodec = &pCodecs[i];
62
+ if(wcscmp(pCodec->MimeType, L"image/png") == 0)
63
+ {
64
+ pPngCodec = pCodec;
65
+ break;
66
+ }
67
+ }
68
+ if(pPngCodec != NULL)
69
+ {
70
+ pBitmap->Save(L"sample.png", &pPngCodec->Clsid);
71
+ }
72
+ free(pCodecs);
73
+ delete pBitmap;
74
+ }
75
+
76
+
77
+ int main()
78
+ {
79
+ // GDI+の開始
80
+ GdiplusStartupInput startupInput;
81
+ ULONG_PTR token;
82
+ GdiplusStartup(&token, &startupInput, NULL);
83
+
84
+ SampleClipboard();
85
+
86
+ // GDI+の終了
87
+ GdiplusShutdown(token);
88
+ return 0;
89
+ }
90
+ ```
91
+ GDI+を使う場合は、上記main関数のような開始処理と終了処理が必要です。