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

Int I; // Количество выбираемых линий

BYTE *bits; // Указатель0020на массив битов изображения

BITMAPINFOHEADER *info; // Информационная структура изображения

HANDLE fp; // Дескриптор файла

BITMAPFILEHEADER finfo; // Заголовок файла изображения

long ctsize,imgsize,pixels;// Различные размерности для записи файла

DWORD dw; // Код возврата

char *ptr; // Указатель используемый для записи открытого BM

// Получаем дескриптор рабочего стола

hwndScreen=GetDesktopWindow();

// Получаем контекст устройства рабочего стола

hdcScreen = GetDC( hwndScreen );

// Выделяем память под структуру с информацией о изображении

info = (BITMAPINFOHEADER*)GlobalAlloc(GMEM_FIXED,sizeof(BITMAPFILEHEADER)+(1024*sizeof(RGBQUAD)));

info->biSize = sizeof(BITMAPINFOHEADER);

info->biBitCount = 0;

// Заполняем структуру информацией о изображении

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

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

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

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

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

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

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

);

// Определяем количество бит на пиксель.

if( (info->biBitCount!=4) &&

(info->biBitCount!=8) &&

(info->biBitCount!=24) )

info->biBitCount=24;

// Указываем что изображение не сжато

info->biCompression=BI_RGB;

// Получаем количество пикселей

pixels=info->biWidth*info->biHeight;

switch(info->biBitCount)

{

case 4:ctsize=16;imgsize=pixels/2;break;

case 8:ctsize=256;imgsize=pixels;break;

case 16:ctsize=0;imgsize=pixels*2;break;

case 24:ctsize=0;imgsize=pixels*3;break;

case 32:ctsize=0;imgsize=pixels*4;break;

default:

ReleaseDC( hwndScreen,hdcScreen );

return FALSE;

}

// Инициализируем массив для битов изображения

bits = (unsigned char*)GlobalAlloc(GMEM_FIXED,imgsize);

//Заполняем массив битов изображения

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

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

0, // Первая выбираемая линия для изображения назначения

info->biHeight, // количество выбираемых линий

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

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

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

);

// Формируем заголовок файла

ptr = (char *)&finfo.bfType;

ptr[0]='B';

ptr[1]='M';

//Определяем сдвиг от начала структуры BITMAPFILEHEADER до массива бит

finfo.bfOffBits=sizeof(BITMAPFILEHEADER)+

sizeof(BITMAPINFOHEADER)+

(sizeof(RGBQUAD)*ctsize);

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

finfo.bfSize=finfo.bfOffBits+imgsize;

finfo.bfReserved1=0;

finfo.bfReserved2=0;

//Создаем файл для изображения

fp = CreateFile(name, // указатель с именем файла

GENERIC_WRITE, // режим доступа

0, // Режим использования

NULL, // указатель на параметры безопасности

CREATE_ALWAYS, // метод создания

FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,// атрибуты файла

NULL

);

// Записываем структуру заголовка файла

WriteFile(fp,&finfo,sizeof(BITMAPFILEHEADER),&dw,NULL);

// Записываем структуру информации изображения

WriteFile(fp,info,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*ctsize,&dw,NULL);

// Записываем биты изображения

WriteFile(fp,bits,imgsize,&dw,NULL);

// Закрываем файл

CloseHandle(fp);

//Освобождаем память с информацией изображения

GlobalFree(info);

// Освобождаем память с битами изображения

GlobalFree(bits);

// Освобождаем контекст устройства

ReleaseDC(hwndScreen,hdcScreen);

return TRUE;

}

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