質問編集履歴

1

前回質問を続行します。

2021/05/04 05:56

投稿

dendenmushi
dendenmushi

スコア98

test CHANGED
File without changes
test CHANGED
@@ -1,289 +1 @@
1
- ### 前提・実現したいこと
2
-
3
- デスクトップ画像保存するC言語プログラムにおいて、BitBltからポインタを利用しRGB色情報を取得する方法を知りたいです。
4
-
5
-
6
-
7
- ### 該当のソースコード
8
-
9
-
10
-
11
- desktop_save.c
12
-
13
- ```c
14
-
15
- #include <windows.h>
16
-
17
- #include <stdio.h>
18
-
19
- void DrawCursor(HDC hdc);
20
-
21
- BOOL WriteBitmap(LPTSTR lpszFileName, int nWidth, int nHeight, LPVOID lpBits);
22
-
23
- HBITMAP CreateBackbuffer(int nWidth, int nHeight);
24
-
25
-
26
-
27
- int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
28
-
29
- {
30
-
31
- HDC hdc;
32
-
33
- HWND hwndDesk;
34
-
35
- RECT rc;
36
-
37
- BITMAP bm;
38
-
39
- HBITMAP hbmp;
40
-
41
- HBITMAP hbmpPrev;
42
-
43
-
44
-
45
- hwndDesk = GetDesktopWindow();
46
-
47
- GetWindowRect(hwndDesk, &rc);
48
-
49
-
50
-
51
- hdc = CreateCompatibleDC(NULL);
52
-
53
-
54
-
55
- // CreateDIBSectionで作成したビットマップは直接ピクセルデータにアクセス出来るポインタが使用出来る
56
-
57
- hbmp = CreateBackbuffer(rc.right, rc.bottom);
58
-
59
-
60
-
61
- BITMAP i;
62
-
63
- hbmpPrev = (HBITMAP)SelectObject(hdc, hbmp);
64
-
65
- // printf("%d\n", hbmpPrev[0]);
66
-
67
-
68
-
69
-
70
-
71
- // ピクセルデータを取得したいイメージをBitBltで転送して取り出せばよい
72
-
73
- BitBlt(hdc, 0, 0, rc.right, rc.bottom, GetWindowDC(hwndDesk), 0, 0, SRCCOPY);
74
-
75
- DrawCursor(hdc);
76
-
77
-
78
-
79
- GetObject(hbmp, sizeof(BITMAP), &bm);
80
-
81
- if (WriteBitmap(TEXT("capture.bmp"), rc.right, rc.bottom, bm.bmBits))
82
-
83
- MessageBox(NULL, TEXT("ファイルを作成しました。"), TEXT("OK"), MB_OK);
84
-
85
- else
86
-
87
- MessageBox(NULL, TEXT("ファイルの作成に失敗しました。"), NULL, MB_ICONWARNING);
88
-
89
- // DIBセクションのHBITMAPをSelectObjectしたメモリDCを転送先にしてBitBltしたら、作成時に受け取ったポインタにピクセルデータが格納
90
-
91
- SelectObject(hdc, hbmpPrev);
92
-
93
- DeleteObject(hbmp);
94
-
95
- DeleteDC(hdc);
96
-
97
-
98
-
99
- return 0;
100
-
101
- }
102
-
103
-
104
-
105
- void DrawCursor(HDC hdc)
106
-
107
- {
108
-
109
- int x, y;
110
-
111
- CURSORINFO cursorInfo;
112
-
113
- ICONINFO iconInfo;
114
-
115
-
116
-
117
- cursorInfo.cbSize = sizeof(CURSORINFO);
118
-
119
- GetCursorInfo(&cursorInfo);
120
-
121
-
122
-
123
- GetIconInfo(cursorInfo.hCursor, &iconInfo);
124
-
125
-
126
-
127
- x = cursorInfo.ptScreenPos.x - iconInfo.xHotspot;
128
-
129
- y = cursorInfo.ptScreenPos.y - iconInfo.yHotspot;
130
-
131
- DrawIcon(hdc, x, y, cursorInfo.hCursor);
132
-
133
- }
134
-
135
-
136
-
137
- BOOL WriteBitmap(LPTSTR lpszFileName, int nWidth, int nHeight, LPVOID lpBits)
138
-
139
- {
140
-
141
- HANDLE hFile;
142
-
143
- DWORD dwResult;
144
-
145
- DWORD dwSizeImage;
146
-
147
- BITMAPFILEHEADER bmfHeader;
148
-
149
- BITMAPINFOHEADER bmiHeader;
150
-
151
-
152
-
153
- hFile = CreateFile(lpszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
154
-
155
- if (hFile == INVALID_HANDLE_VALUE)
156
-
157
- return FALSE;
158
-
159
-
160
-
161
- dwSizeImage = nHeight * ((3 * nWidth + 3) / 4) * 4;
162
-
163
-
164
-
165
- ZeroMemory(&bmfHeader, sizeof(BITMAPFILEHEADER));
166
-
167
- bmfHeader.bfType = *(LPWORD)"BM";
168
-
169
- bmfHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSizeImage;
170
-
171
- bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
172
-
173
-
174
-
175
- WriteFile(hFile, &bmfHeader, sizeof(BITMAPFILEHEADER), &dwResult, NULL);
176
-
177
-
178
-
179
- ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
180
-
181
- bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
182
-
183
- bmiHeader.biWidth = nWidth;
184
-
185
- bmiHeader.biHeight = nHeight;
186
-
187
- bmiHeader.biPlanes = 1;
188
-
189
- bmiHeader.biBitCount = 24;
190
-
191
- bmiHeader.biSizeImage = dwSizeImage;
192
-
193
- bmiHeader.biCompression = BI_RGB;
194
-
195
-
196
-
197
- WriteFile(hFile, &bmiHeader, sizeof(BITMAPINFOHEADER), &dwResult, NULL);
198
-
199
-
200
-
201
- WriteFile(hFile, lpBits, dwSizeImage, &dwResult, NULL);
202
-
203
-
204
-
205
- CloseHandle(hFile);
206
-
207
-
208
-
209
- return TRUE;
210
-
211
- }
212
-
213
-
214
-
215
- HBITMAP CreateBackbuffer(int nWidth, int nHeight)
216
-
217
- {
218
-
219
- LPVOID lp;
220
-
221
- BITMAPINFO bmi;
222
-
223
- BITMAPINFOHEADER bmiHeader;
224
-
225
-
226
-
227
- ZeroMemory(&bmiHeader, sizeof(BITMAPINFOHEADER));
228
-
229
- bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
230
-
231
- bmiHeader.biWidth = nWidth;
232
-
233
- bmiHeader.biHeight = nHeight;
234
-
235
- bmiHeader.biPlanes = 1;
236
-
237
- bmiHeader.biBitCount = 24;
238
-
239
-
240
-
241
- bmi.bmiHeader = bmiHeader;
242
-
243
-
244
-
245
- return CreateDIBSection(NULL, (LPBITMAPINFO)&bmi, DIB_RGB_COLORS, &lp, NULL, 0);
246
-
247
- }
248
-
249
- ```
250
-
251
-
252
-
253
-
254
-
255
-
256
-
257
- ### 発生している問題・エラーメッセージ
258
-
259
-
260
-
261
- 下記記載しますと画像作成でいたらずSTOPてしいました
1
+ ※前回質問続行します。間違えて立ててしためこち削除しま
262
-
263
- ```c
264
-
265
- printf("%d\n", hbmpPrev[0]);
266
-
267
- ```
268
-
269
- BitBltの転送先の
270
-
271
-
272
-
273
-
274
-
275
- ### 補足情報(FW/ツールのバージョンなど)
276
-
277
- 言語:C
278
-
279
- コンパイラ:gcc
280
-
281
- OS:Windows10
282
-
283
-
284
-
285
-
286
-
287
- ### 試したこと
288
-
289
- hdcからデータ取得なども試みましたが、具体的にポインタ情報などどのように取得できればよいか見つからず、[以前質問](https://teratail.com/questions/336358)からのより細かいデータ取得方法になるため別質問を立てました。アドバイス何か頂けないでしょうか。よろしくお願い致します。