1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
| TCHAR szWinName[] = L"MyWindow"; //имя класса главного окна
HINSTANCE hInstance;
void SaveBMP(HWND hWnd, HDC hdc) {
BITMAPFILEHEADER bfh; //структура с заголовком файла
BITMAPINFOHEADER bih; //структура с описанием формата картинки
BITMAPINFO bi; //описание формата для функции GetDIBits ()
void *pdwBits = NULL; //указатель на буфер с будущим рисунком
DWORD dwWB = 0; //переменная для хранения записанных байт в файл
HANDLE hFile = NULL; //хэндл открытого файла
HBITMAP bmpMem = (HBITMAP)LoadImage(hInstance, szWinName, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
//Создаем пустой буфер, в который потом скопируется картинка
pdwBits = (void *)GlobalAlloc(GMEM_FIXED, 800 * 600 * 4);
//Обнуляем структуры
memset(&bfh, 0, sizeof(BITMAPFILEHEADER));
memset(&bih, 0, sizeof(BITMAPINFOHEADER));
memset(&bi, 0, sizeof(BITMAPINFO));
//Заполняем заголовочную структуру
bfh.bfType = 0x4D42; // Обозначим, что это bmp 'BM'
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
bfh.bfSize = bfh.bfOffBits + 800 * 600 * 4; // Посчитаем размер конечного файла
//Заполняем описание картинки
bih.biSize = sizeof(bih); // Так положено
bih.biBitCount = 32; // 16 бит на пиксель
bih.biCompression = BI_RGB; // Без сжатия
bih.biHeight = 600;
bih.biWidth = 800;
bih.biPlanes = 1;
//Копируем в структуру BITMAPINFO
CopyMemory(&bi, &bih, sizeof(BITMAPINFOHEADER));
//Получаем с помощью функции саму картинку из контекста в памяти
GetDIBits(hdc, bmpMem, 0, 600, pdwBits, (LPBITMAPINFO)&bi, DIB_RGB_COLORS);
//Создаем файл для записи
hFile = CreateFile(L"save.bmp",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL);
if (hFile == INVALID_HANDLE_VALUE) {
if (pdwBits) GlobalFree(pdwBits);
SetWindowText(hwndMain, L"Ошибка при открытии файла");
return;
}
//Записываем структуру с заголовком файла
if (!WriteFile(hFile, (void *)&bfh, sizeof(BITMAPFILEHEADER), &dwWB, NULL)) {
SetWindowText(hwndMain, L"Ошибка при записи BITMAPFILEHEADER");
if (pdwBits) GlobalFree(pdwBits);
return;
}
//Записываем структуру с описанием формата картинки
if (!WriteFile(hFile, (void *)&bih, sizeof(BITMAPINFOHEADER), &dwWB, NULL)) {
SetWindowText(hwndMain, L"Ошибка при записи BITMAPINFOHEADER");
if (pdwBits) GlobalFree(pdwBits);
return;
}
//Записываем собсна саму картинку после двух предыдущих структур
if (!WriteFile(hFile, (void *)pdwBits, 800 * 600 * 4, &dwWB, NULL)) {
SetWindowText(hwndMain, L"Ошибка при записи DIBits");
if (pdwBits) GlobalFree(pdwBits);
return;
}
//Закрываем хэндл файла и очищаем буфер
CloseHandle(hFile);
if (pdwBits) GlobalFree(pdwBits);
return;
} |