Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

Сохранение изображения в файле

Для того чтобы сохранить изображение в файл, как минимум необходимо знать дескриптор сохраняемого изображения. После того как дескриптор нам известен, требуется заполнить структуру BITMAPINFOHEADER, которая содержит информацию о размере и формате цвета изображения, не зависящего от устройства (device-independent bitmap (DIB)). Для этих целей используется дескриптор нашего изображения и дескриптор контекста устройства. Контекст устройства удобно взять от окна рабочего стола.

hwndScreen=GetDesktopWindow();

hdcScreen = GetDC( hwndScreen );

Для заполнения структуры потребуется несколько раз вызвать функцию GetDIBits. Эта функция применяется для выборки двоичных данных указанного растрового изображения в буфер с использованием указанного формата. В неё мы передаем дескрипторы контекста устройства и изображения, и основываясь на из данных заполняем поля нашей структуры. В качестве массива для данных изображения указываем NULL, так как первоначально нам требуется определить свойства самого изображения заносимого в структуру BITMAPINFO.

GetDIBits( hdcScreen, // дескриптор контекста устройства

bitmap, // дескриптор изображения

0, // Первая строка развертки, которая должна

// быть выбрана

0, // Число копируемых линий

NULL, // адрес массива для битов изображения

(BITMAPINFO*)info, // адрес структуры для данных изображения

DIB_RGB_COLORS // RGB или индекс палитры

);

После того как структура будет заполнена, требуется определить количество бит приходящихся на один пиксель. Если это число не является 4, 8 или 24, то устанавливаем количество бит в 24, и указываем, что изображение не сжато. После этого определяем размер изображения основываясь на данных полученных в предыдущем шаге. После того как размер изображения будет определен, необходимо заполнить массив битов изображения, путем вторичного вызова функции GetDIBits. Если массив успешно заполнен, следует инициализировать структуру содержащую информацию о типе, размере и местоположении файла в котором будет сохранено изображение. Для этого потребуется заполнить поле bfOffBits, характеризующее сдвиг от начала структуры BITMAPFILEHEADER до массива бит и bfSize – характеризующее размер в байтах файла изображения.

//Сдвиг от начала структуры BITMAPFILEHEADER до массива бит

finfo.bfOffBits=sizeof(BITMAPFILEHEADER)+

sizeof(BITMAPINFOHEADER)+

(sizeof(RGBQUAD)*ctsize);

// Размер файла изображения в байтах

finfo.bfSize=finfo.bfOffBits+imgsize;

finfo.bfReserved1=0;

finfo.bfReserved2=0;

Когда все манипуляции со структурами и данными будут завершены, потребуется создать файл для изображения и последовательно записать в него структуру содержащую заголовок файла, затем структуру с информацией о изображении и в завершении массив бит этого изображения. Ну и соответственно не забыть закрыть открытые дескрипторы и освободить контекст устройства. Ниже приведен исходный код, позволяющий сохранить изображение окна в файл.

void PrintWindow(HWND hWnd)

{

HDC hDCMem = CreateCompatibleDC(NULL);

RECT rect;

GetWindowRect(hWnd, & rect);

HBITMAP hBmp = NULL;

HDC hDC = GetDC(hWnd);

hBmp = CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top);

ReleaseDC(hWnd, hDC);

HGDIOBJ hOld = SelectObject(hDCMem, hBmp);

SendMessage(hWnd, WM_PRINT, (WPARAM) hDCMem, PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED);

SelectObject(hDCMem, hOld);

DeleteObject(hDCMem);

OpenClipboard(hWnd);

EmptyClipboard();

SetClipboardData(CF_BITMAP, hBmp);

CloseClipboard();

}

BOOL SaveBitmap(char *name,HBITMAP bitmap)

{

HDC hdcScreen; // Контекст устройства экрана

HWND hwndScreen; // Дескриптор окна рабочего стола

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]