Загрузка...
 

Windows GDI: Выводим растровое изображение (Bitmap)


Контекст памяти

  • Является специфическим типом контекста устройства.
  • Операции вывода в контекст памяти не приведут к отображению этого вывода на реальном устройстве. Содержимое контекста памяти можно отобразить на устройстве, с которым он совместим.
  • Концептуально очень похож на поверхность DirectDraw.

Функция CreateCompatibleDC создаёт контекст памяти:

Прототип функции CreateCompatibleDC
HDC CreateCompatibleDC(HDC hdc);

Единственный параметр является дескриптором контекста какого-либо реального устройства. Если в качестве этого параметра указать NULL, то создаваемый контекст будет совместим с текущим экраном, что на практике означает совместимость с контекстом Рабочего стола Windows. После создания контекста памяти его поверхность представляет собой один монохромный пиксель, растянутый по всей ширине и высоте. Поэтому рисовать в контексте устройства сразу после его создания не имеет смысла. Для этого надо сначала обеспечить контекст памяти нужной поверхностью. Первый шаг к этому - создание объекта GDI типа растр (HBITMAP). Например с помощью функции CreateCompatibleBitmap:

Прототип функции CreateCompatibleBitmap
HBITMAP CreateCompatibleBitmap(HDC hdc, int nWidth, int nHeight);

Три параметра функции описывают контекст устройства, с которым будет совместим растр, ширину и высоту создаваемого растра. Первый параметр влияет на цветовую организацию растра и на используемую палитру. Эти характеристики будут соответствовать аналогичным характеристикам контекста устройства hdc. При успешном завершении функция возвращает дескриптор создаваемого растра.

После создания растра его необходимо выбрать в контекст памяти. Например, так:

Пример выбора растра в контекст памяти
...
// Получить контекст реального устройства
hdc=GetDC(hwnd);
// Создать контекст памяти и растр
hMemDC=CreateCompatibleDC(hdc);
hMemBitmap=CreateCompatibleBitmap(hdc, 200, 200);
// Выбрать растр в контекст памяти
SelectBitmap(hMemDC, hMemBitmap);
...

По завершении работы с контекстом памяти его необходимо удалить при помощи функции DeleteDC:

Прототип функции DeleteDС
BOOL DeleteDC(HDC hdc);
Закрыть
noteОбрати внимание:

Если контекст создавался при помощи функции CreateCompatibleDC, то освобождать его нужно функцией DeleteDC.
Если контекст получен при помощи функций GetDC и GetWindowDC, то освобождать его нужно функцией ReleaseDC.

После удаления контекста памяти, необходимо удалить ранее созданный растр. Например, с помощью функции DeleteObject:

Прототип функции DeleteObject
BOOL DeleteObject(HGDIOBJ hObject);

Здесь hObject - реально существующий дескриптор логического пера, кисти, шрифта, растровой (точечной) картинки, региона или палитры.
В случае неудачного завершения возвращает "0" (ноль).

Копирование блоков

В GDI реализовано несколько функций, позволяющих копировать участки контекстов (в нашем случае они являются массивами точек) один в другой. В названии каждой из этих функций присутствует суффикс Blt (block transfer - англ. "блочное копирование").

Функция PatBlt не производит копирования, а лишь заполняет нужный прямоугольник текущей кистью, выбранной в контекст:

Прототип функции PatBlt
BOOL PatBlt(HDC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, DWORD dwRop);

Параметры функции PatBlt:

Параметр Описание
HDC hdc Дескриптор контекста устройства.
int nXLeft Х-координата, в логических единицах измерения, верхнего левого угла окрашиваемого прямоугольника.
int nYLeft Y-координата, в логических единицах измерения, верхнего левого угла окрашиваемого прямоугольника.
int nWidth Ширина окрашиваемого прямоугольника (в логических единицах).
int nHeight Высота окрашиваемого прямоугольника (в логических единицах).
DWORD dwRop Код растровой операции. Возможные значения представлены в Таблице 8.

Таблица 8. Возможные значения параметра dwRop функции PatBlt

Значение Описание
PATCOPY Копирует заданный узор (PAT - от англ. pattern - "узор, заливка") в принимающий точечный рисунок.
PATINVERT Объединяет цвета заданного узора с цветами целевого прямоугольника, используя булев оператор исключающее ИЛИ (XOR).
DSTINVERT Инвертирует целевой прямоугольник.
BLACKNESS Закрашивает целевой прямоугольник, используя цвет, связанный с индексом 0 в физической палитре. (Этот цвет является черным для заданной по умолчанию физической палитры.).
WHITENESS Закрашивает целевой прямоугольник, используя цвет, связанный с индексом 1 в физической палитре. (Этот цвет является белым для заданной по умолчанию физической палитры.)

В случае завершения работы функции с ошибкой, возвращается "0" (ноль).

Функция BitBlt копирует блоки из одного контекста в другой:

Прототип функции BitBlt
BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);

Параметры функции BitBlt:

Параметр Описание
HDC hdcDest Дескриптор целевого контекста устройства.
int nXDest x-коорд. левого верхнего угла целевого прямоугольника.
int nYDest y-коорд. левого верхнего угла целевого прямоугольника.
int nWidth Устанавливает ширину (в логических единицах измерения) исходного и целевого прямоугольников.
int nHeight Устанавливает высоту (в логических единицах измерения) исходного и целевого прямоугольников.
HDC hdcSrc Дескриптор исходного контекста устройства.
int nXSrc x-коорд. левого верхнего угла исходного прямоугольника.
int nYSrc y-коорд. левого верхнего угла исходного прямоугольника.
DWORD dwRop Код растровой операции. Возможные значения представлены в Таблице 9.

Таблица 9. Возможные значения параметра dwRop функции BitBlt 1

Значение Описание
BLACKNESS Заполняет целевой прямоугольник, используя цвет, связанный с индексом 0 в физической палитре. (Этот цвет является черным для заданной по умолчанию физической палитры.)
WHITENESS Заполняет целевой прямоугольник, используя цвет, связанный с индексом 1 в физической палитре. (Этот цвет является белым для заданной по умолчанию физической палитры.)
CAPTUREBLT Windows 98/Me, Windows 2000/XP: Включает любые окна, которые наслоены поверх вашего окна в результирующем изображении. По умолчанию, изображение содержит только ваше окно.
DSTINVERT Инвертирует целевой прямоугольник.
MERGECOPY Объединяет цвета исходного прямоугольника с кистью в текущий момент выбранной в hdcDest, при помощи использования булева оператора И (AND).
MERGEPAINT Объединяет цвета инвертированного исходного прямоугольника с цветами целевого прямоугольника при помощи использования булева оператора ИЛИ (OR).
NOMIRRORBITMAP Windows 98/Me, Windows 2000/XP: Препятствует точечному рисунку быть зеркалируемым.
NOTSRCCOPY Копирует инвертированный исходный прямоугольник в целевой.
NOTSRCERASE Комбинирует цвета исходных и целевых прямоугольников при помощи использования булева оператора ИЛИ (OR) и затем инвертирует получающийся в результате цвет.
PATCOPY Копирует кисть, в текущий момент выбранную в hdcDest, в целевой точечный рисунок.
PATINVERT Комбинирует цвета кисти, в текущий момент выбранной в hdcDest, с цветами инвертированного исходного прямоугольника при помощи использования булева оператора ИЛИ (OR). Результаты этой операции объединяются с цветами целевого прямоугольника при помощи использования булева оператора ИЛИ (OR).
SRCAND Комбинирует цвета исходных и целевых прямоугольников при помощи использования булева оператора И (AND).
SRCCOPY Копирует исходный прямоугольник непосредственно в целевой прямоугольник. Применяется наиболее часто.
SRCERASE Комбинирует инвертированные цвета целевого прямоугольника с цветами исходного прямоугольника при помощи использования булева оператора И (AND).
SRCINVERT Комбинирует цвета источникового и целевого прямоугольников при помощи использования булева оператора исключающее ИЛИ (XOR).
SRCPAINT Комбинирует цвета источникового и целевого прямоугольников при помощи использования булева оператора ИЛИ (OR).

Замечания:

  • Функция BitBlt делает отсечение по границам только в целевом контексте устройства (DC).
  • Если в исходном контексте устройства действует вращение или преобразование сдвига фрагмента изображения, BitBlt возвращает ошибку. Если в исходном контексте устройства встречаются другие преобразования (а преобразование соответствия в целевом контексте устройства не действует ), прямоугольник в целевом контексте устройства растягивается, сжимается или вращается, по мере необходимости.
  • Если цветовые форматы источниковых и целевых контекстов устройства не соответствуют, функция BitBlt преобразует исходный цветовой формат, чтобы он соответствовал целевому формату.
  • Когда фиксируется расширенный метафайл, происходит ошибка, если исходный контекст устройства идентифицирует контекст устройства расширенного метафайла.
  • Не все устройства поддерживают функцию BitBlt. Для подробной информации, см. RC_BITBLT характеристика растровой записи в функции GetDeviceCaps, а так же в следующих функциях: MaskBlt, PlgBlt и StretchBlt.
  • BitBlt возвращает ошибку, если источниковый и целевой контексты устройства обозначают различные устройства. Чтобы пересылать данные между контекстами устройства (DC) для разных устройств, преобразуйте точечный рисунок в аппаратно-независимый растровый формат (DIB) при помощи вызова функции GetDIBits. Чтобы показать на экране аппаратно-независимый растровый формат (DIB) для второго устройства, вызовите функцию SetDIBits или StretchDIBits.
  • В случае завершения работы функции с ошибкой, возвращается "0" (ноль).


Функция StretchBlt копирует блоки из одного контекста в другой + изменяет размеры изображения (растягивает или сжимает) в соответствии с размерами прямоугольника-приёмника:

Прототип функции StretchBlt
BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop);

Параметры функции StretchBlt:

Параметр Описание
HDC hdcDest Дескриптор целевого контекста устройства.
int nXOriginDest x-коорд. левого верхнего угла целевого прямоугольника.
int nYOriginDest y-коорд. левого верхнего угла целевого прямоугольника.
int nWidthDest Ширина (в логических единицах измерения) целевого прямоугольника.
int nHeightDest Высота (в логических единицах измерения) целевого прямоугольника.
HDC hdcSrc Дескриптор исходного контекста устройства.
int nXOriginSrc x-коорд. левого верхнего угла исходного прямоугольника.
int nYOriginSrc y-коорд. левого верхнего угла исходного прямоугольника.
int nWidthSrc Ширина (в логических единицах измерения) исходного прямоугольника.
int nHeightSrc Высота (в логических единицах измерения) исходного прямоугольника.
DWORD dwRop Код растровой операции. Возможные значения представлены в Таблице 9.


Если прямоугольник-источник при копировании отличается по размеру от прямоугольника-приёмника, то GDI будет вынужден произвести растяжение или сжатие соответствующих измерений. Различные режимы растяжения/сжатия задаются при помощи функции SetStretchBltMode:

Прототип функции SetStretchBltMode
BOOL SetStretchBltMode(HDC hdc, int iStretchMode);

Первый параметр - дескриптор контекста устройства, для которго устанавливается нужный режим.
Второй параметр (int iStretchMode) является режимом растяжения. Он может принимать одно из следующих значений:

Таблица 10. Возможные значения параметра int iStretchMode функции SetStretchBltMode

Значение Описание
COLORONCOLOR В этом режиме избыточные строки и столбцы просто уничтожаются ("обрезаются") без попытки использовать хранящуюся в них информацию. Наиболее часто используемый режим при копировании участков цветных растров.
BLACKONWHITE Выполняет булеву операцию И (AND), используя коды цвета для ликвидируемых и существующих пикселей. Для каждой удаляемой строки/столбца осуществляется логическая поразрядная операция AND между удаляемой и остающейся строкой/столбцом. Для чёрно-белого растра обеспечивается преобладание чёрных точек над белыми.
WHITEONBLACK Выполняет булеву операцию И (AND), используя коды цвета для ликвидируемых и существующих пикселей. Для каждой удаляемой строки/столбца осуществляется логическая поразрядная операция OR между удаляемой и остающейся строкой/столбцом. Для чёрно-белого растра обеспечивается преобладание белых точек над чёрными.
HALFTONE Преобразует пиксели исходного прямоугольника в блоки пикселей в целевом прямоугольнике. Среднее значение цвета всего целевого блока пикселей подбирается близким по значению к цвету исходных пикселей. После установки режима растяжения HALFTONE , приложение должно вызвать функцию SetBrushOrgEx, чтобы установить начало координат кисти. Если она завершается ошибкой, то происходит нарушение границ кисти Этот параметр не поддерживается в среде Windows 95/98/Me.
STRETCH_ANDSCANS Такое же как и BLACKONWHITE.
STRETCH_DELETESCANS Такое же как и COLORONCOLOR.
STRETCH_HALFTONE Такое же как и HALFTONE.
STRETCH_ORSCANS Такое же как и WHITEONBLACK.


В случае успешного завершения, возвращаемое значение - предшествующий режим растяжения. Иначе - возвращается 0 (ноль).
Замечания:

  • Режим растяжения определяет, как система комбинирует ряды или столбцы точечного рисунка с существующими пикселями в устройстве отображения, когда приложение вызывает функцию StretchBlt.
  • Режимы BLACKONWHITE (STRETCH_ANDSCANS) и WHITEONBLACK (STRETCH_ORSCANS), обычно используются для, сбережения пикселей изображения в монохромных точечных рисунках. Режим COLORONCOLOR (STRETCH_DELETESCANS) обычно используется для, сбережения точечных рисунков цвет в цвет.
  • Режим HALFTONE медленнее и требует большей обработки исходного изображения, чем остальные три режима; но создает изображение более высокого качества.

Аппаратно-независимые растры

  • Не являются объектами GDI.
  • Подразделяются на 2 вида: палитровые и беспалитровые.
  • За их размещение в памяти, хранение и последующее удаление отвечает программист.
  • Основное назначение аппаратно-независимых растров - хранение на диске с возможностью последующего корректного вывода битмапа на обширном классе устройств.

Наряду с растровыми объектами GDI, начиная с Windows 3.0, была введена поддержка аппаратно-независимых растров (Device Independent Bitmap - DIB). Поскольку цветность традиционных аппаратно-зависимых растров (Device Dependent Bitmap - DDB) зависит от того устройства, для которого они предназначены, они не годятся для обмена информацией между устройствами. Если устройство, на которое переносится такой графический файл имеет другую цветовую организацию, то качество переноса будет крайне низким. Для решения этой проблемы (и некоторых других) была создана поддержка DIB. Она включает в себя всего несколько функций, позволяющих преобразовывать DIB к DDB, совместимому с конкретным устройством.
Для того, чтобы функции GDI могли работать с DIB, изображения этого вида должны иметь строго определённую структуру:

Структура файла BMP, содержащего палитру:

BITMAPFILEHEADERBITMAPINFOHEADERПАЛИТРА RGBQUAD(256)ГРАФИЧЕСКИЕ ДАННЫЕ

Структура файла BMP, не содержащего палитру:

BITMAPFILEHEADERBITMAPINFOHEADERГРАФИЧЕСКИЕ ДАННЫЕ

В обоих случаях изображение представляет собой массив точек, хранящихся построчно. Для изображения, использующего палитру, графические данные для каждой точки представляют собой лишь указатели на индексы в палитре. Для беспалитрового изображения графические данные представляют собой непосредственные комбинации соотношений красного, зелёного и синего цветов для каждой точки.
Типичный DIB-файл (в Windows он обычно имеет расширение BMP) начинается со структуры BITMAPFILEHEADER, позволяющей начать работу с ним:

Прототип структуры BITMAPFILEHEADER
typedef	struct	tagBITMAPFILEHEADER
{
WORD bfType;		// Тип файла. Должен содержать 'BM'
DWORD	bfSize;		// Размер файла в байтах
WORD	bfReserved1;		// Зарезервировано. В данный момент здевь всегда 0 (ноль)
WORD	bfReserved2;		// Зарезервировано. В данный момент здевь всегда 0 (ноль)
DWORD	bfOffBits;		// Смещение от начала файла до графических данных
}	BITMAPFILEHEADER;

Для работы с функциями GDI эта структура не нужна. Она необходима лишь на этапе считывания файла в память, чтобы правильно определить тип файла и начало графических данных. Сама же структура, как правило, в оперативную память не считывается.
Следом за структурой BITMAPFILEHEADER в графическом файле располагается структура BITMAPINFOHEADER, содержащая важные сведения об изображении:

Прототип структуры BITMAPINFOHEADER
typedef	struct	tagBITMAPINFOHEADER
{
DWORD	bfSize;		// Размер файла в байтах
LONG	biWidth;		// Ширина растра в пикселях
LONG	biHeight;		// Высота растра в пикселях
WORD	biPlanes;		// Количество плоскостей (всегда 1)
WORD biBitCount;		// Количество бит на 1 пиксель
DWORD	biCompression;		// Тип сжатия (BI_RGB - без сжатия)
DWORD	biSizeImage;			// Размер изображения в байтах (обычно 0)
LONG	biXPelsPerMeter;	// Разрешение по горизонтали
LONG	biYPelsPerMeter;		// Разрешение по вертикали
DWORD	biClrUsed;			// Количество используемых цветов
DWORD biClrImportant;		// Количество важных цветов (обычно 0)
}	BITMAPINFOHEADER;

Замечания:

  • Количество бит на 1 пиксель характеризует максимальное количество цветов в растре. Самые распространённые значения поля biBitCount - 8 (для 256-цветных палитровых изображений) и 24 (для беспалитровых изображений). При значении 8 следом за структурой BITMAPINFOHEADER палитра с выбранными в неё и индексированными цветами. Количество элементов в палитре 8-битного файла BMP равно , как правило, 256. То есть используются все доступные позиции в палитре. При значении 24 палитра отсутствует, и следом за структурой BITMAPINFOHEADER сразу располагаются графические данные.
  • Большинство файлов BMP хранится на жёстком диске ПК без сжатия. Поэтому далее будет рассматриваться только этот случай. Впрочем, функции GDI умело работают и со сжатыми растрами.

Структура BITMAPFILEHEADER является частью более общей структуры BITMAPINFO, которая объединяет в себе заголовок DIB и палитру:

Прототип структуры BITMAPINFO
typedef	struct	tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;		// Информационный заголовок растра
RGBQUAD	bmiColors[1];			// Массив структур, реализующих палитру
}	BITMAPINFO;

Структура RGBQUAD описывает так называемый RGB-триплекс, который при помощи смешения трёх базовых цветов (красного, зелёного и синего) определяет текущий цвет:

Прототип структуры RGBQUAD
typedef	struct	tagRGBQUAD
{
BYTE	rgbBlue;		// Синяя составляющая
BYTE rgbGreen;		// Зелёная составляющая
BYTE	rgbRed;		// Красная составляющая
BYTE	rgbReserved;		// Зарезервированный параметр
}	RGBQUAD;

Не забываем, что размер структуры RGBQUAD равен 24 битам. В случае 24-битного файла BMP первая структура RGBQUAD после BITMAPINFOHEADER описывает цвет реальной точки, а в случае 8-битного файла BMP - лишь элемент палитры.
Для палитровых файлов рекомендуется определять начало палитры при помощи выражения:

...
pColor = ((LPSTR)pBitmapInfo + (WORD)(pBitmapInfo->bmiHeader.bSize));
...

Это делается для возможности последующего изменения структуры BITMAPINFOHEADER с целью добавления новых возможностей в DIB, например новых методов компрессии. Для ОС MS Windows 95/98/2000 это уже было проделано: введены новые структуры BITMAPV4HEADER и BITMAPV5HEADER.
Следом за палитрой (для палитровых файлов) или непосредственно за структурой BITMAPINFOHEADER (для беспалитровых файлов) располагаются собственно графические данные. Они хранятся построчно друг за другом. Примечательно, что распространённой практикой является хранение данных BMP "вверх ногами" (т.е. первая строка расположена в самом "низу", в конце файла). Кроме того, если размер строки растра не кратен 4, то она дополняется от 1 до 3 пустыми (нулевыми байтами), чтобы длина строки оказалась кратна параграфу. При использовании функций GDI необходимо соблюдать эти принципы, хотя в остальных случаях это делать вовсе необязательно.

Функции для работы с аппаратно-независимыми растрами

Функция CreateDIBitmap создаёт растровый объект GDI из аппаратно-независимого растра:

Прототип функции CreateDIBitmap
HBITMAP CreateDIBitmap(HDC hdc, CONST BITMAPINFOHEADER *lpbmih, DWORD fdwInit, CONST VOID *lpbInit, CONST BITMAPINFO *lpbmi, UINT fuUsage);

Параметры функции CreateDIBitmap:

Параметр Описание
HDC hdc Дескриптор контекста устройства, с которым должен быть совместим получаемый растр.
CONST BITMAPINFOHEADER *lpbmih Указатель на структуру содержащую информацию о заголовке точечного рисунка. Она обычно берётся из самого растрового файла. В MS Windows 3.51 (и более ранних) она называется BITMAPINFOHEADER. В MS Windows 95 и MS Windows NT 4.0 - BITMAPV4HEADER. В MS Windows 98/Me и MS Windows 2000 - BITMAPV5HEADER.
DWORD fdwInit Определяет, как система инициализирует растровые биты. При значении CBM_INIT для инициализации растровых битов система использует данные, на которые указывают параметры lpbInit и lpbmi. При значении 0 (ноль) система не инициализирует растровые биты.
CONST VOID *lpbInit Указатель на массив байтов, содержащих исходные растровые данные. Формат данных зависит от члена biBitCount структуры BITMAPINFO, на которую указывает параметр lpbmi.
CONST BITMAPINFO *lpbmi Указатель на структуру BITMAPINFO, описывающую размеры и цветовой формат массива, на который указывает параметр lpbInit.
UINT fuUsage Определяет, был ли член bmiColors структуры BITMAPINFO инициализирован и, если это так, содержит ли bmiColors явно значения красного , зеленого, синего цветов (RGB) или индексы палитры. При значении DIB_PAL_COLORS таблица цветов предусматривается и состоит из массива 16-битовых индексов в логической палитре контекста устройства, в который должен выбираться точечный рисунок. При значении DIB_RGB_COLORS таблица цветов предусматривается и содержит точные значения RGB.

В случае успешного завершения работы функции, возвращаемое значение - дескриптор совместимого точечного рисунка. В случае ошибки возвращается NULL.
Замечания:

  • Аппаратно-зависимый точечный рисунок (DDB), который создается, должен быть без определенной битовой глубины цвета вашего применяемого контекста устройства (DC). Чтобы создавать точечный рисунок, который имеет другую битовую глубину цвета, используйте функцию CreateDIBSection.
  • Чтобы достичь оптимальной скорости рисования растра устройством, установите параметр fdwInit в значение CBM_INIT. Затем используйте тот же самый разрядность цвета формата DIB как видео режим. Когда видеоизображение выполняется в режиме 4- или 8- бит на пиксель (bpp), используйте флажок DIB_PAL_COLORS.
  • Флажок CBM_CREATDIB для параметра fdwInit больше не поддерживается.
  • Когда вам больше не нужен точечный рисунок, вызовите функцию DeleteObject, чтобы удалить его.
  • ICM: Управление цветом не выполняется. Соответственно содержание результирующего точечного рисунка, после того, как он создался, является не цветным.
  • MS Windows 95/98/Me: Созданный точечный рисунок по величине не может быть больше 16 МБ.


Функция StretchDIBits позволяет скопировать указанный прямоугольник данных, расположенный в аппаратно-независимом растре, внутрь какого-либо контекста устройства:

Прототип функции StretchDIBits
int StretchDIBits(HDC hdc, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, nSrcHeight, CONST VOID *lpBits, CONST BITMAPINFO *lpBitsInfo, UINT iUsage, DWORD dwRop);

Параметры функции StretchDIBits:

Параметр Описание
HDC hdcDest Дескриптор целевого (принимающего) контекста устройства.
int XDest x-коорд. левого верхнего угла целевого прямоугольника.
int YDestt y-коорд. левого верхнего угла целевого прямоугольника.
int nDestWidth Ширина (в логических единицах измерения) целевого прямоугольника.
int nDestHeight Высота (в логических единицах измерения) целевого прямоугольника.
int XSrc x-коорд. левого верхнего угла исходного прямоугольника.
int YSrc y-коорд. левого верхнего угла исходного прямоугольника.
int nSrcWidth Ширина исходного прямоугольника в DIB в пикселях.
int nSrcHeight Высота исходного прямоугольника в DIB в пикселях.
CONST VOID *lpBits Указывает на графические данные копируемого DIB. Является указателем на биты аппаратно-независимого растрового формата (DIB), которые сохраняются как массив байтов.
CONST BITMAPINFO *lpBitsInfo Указатель на структуру BITMAPINFO, которая содержит информацию об растровом формате (DIB).
UINT iUsage Устанавливает, предусматривался ли член bmiColors структуры BITMAPINFO и, если это так, содержит ли член bmiColors значения (RGB) чистого красного, зеленого, синего цветов или индексы палитры. При значении DIB_PAL_COLORS массив состоит из 16-битовых индексов в логической палитре источникового контекста устройства. При значении DIB_RGB_COLORS таблица цветов содержит значения констант RGB.
DWORD dwRop Код растровой операции. Возможные значения представлены в Таблице 9.

В случае успешного завершения работы функции, возвращаемое значение - число скопированных строк развертки. В случае ошибки возвращается GDI_ERROR.
Замечания:

  • Начало координат идущего снизу вверх растрового формата (DIB) - нижний левый угол; начало координат идущего сверху вниз растрового формата (DIB) - левый верхний угол.
  • Если знаки параметров nSrcWidth и nDestWidth или параметров nSrcHeight и nDestHeight различаются, функция StretchDIBits создает зеркальное изображение точечного рисунка. Если nSrcWidth и nDestWidth имеют разные знаки, функция создает зеркальное изображение точечного рисунка по оси X. Если nSrcHeight и nDestHeight имеют разные знаки, функция создает зеркальное изображение точечного рисунка по оси Y.
  • ICM: Управление цветом выполняется. Совокупность параметров цвета текущего контекста устройства используется как исходная конфигурация цветового пространства и используется sRGB цветовое пространство.
  • Windows 98/Me, Windows 2000/XP: Эта функция дает возможность формат изображения JPEG или PNG передавать как исходное изображение. При использовании каждый параметр остается тем же самым, кроме следующих случаев:
  • Если член biCompression структуры BITMAPINFOHEADER - BI_JPEG или BI_PNG, параметр lpBits указывает на буфер, содержащий формат изображения JPEG или PNG, соответственно. Член biSizeImage структуры BITMAPINFOHEADER устанавливает размер буфера. Параметр iUsage должен быть установлен в DIB_RGB_COLORS. Параметр dwRop должен быть установлен в SRCCOPY.
  • Чтобы гарантировать надлежащее помещение метафайла в очередь процесса обработки при печати, приложения должны вызывать функцию перехода формата CHECKJPEGFORMAT или CHECKPNGFORMAT, чтобы проверить, что принтер распознает формат JPEG или PNG, соответственно, перед вызовом StretchDIBits.


При использовании функций CreateDIBitmap и StretchDIBits происходит преобразование цветов, хранящихся в DIB, в цвета конкретного устройства, определяемого дескриптором hdc.

Источники:


1. http://www.vsokovikov.narod.ru Авторский сайт Владимира Соковикова. Русскоязычные переводы статей из MSDN.

Contributors to this page: slymentat .
Последнее изменение страницы Понедельник 15 / Февраль, 2021 17:27:30 MSK автор slymentat.

Помочь проекту

yoomoney.ru (бывший Яндекс-деньги): 410011791055108