
- •Цвета и битовые образы
- •Битовые образы, не зависящие от устройства (dib)
- •Файл dib
- •Упакованный формат хранения dib
- •Отображение dib
- •Преобразование dib в объекты "битовые образы"
- •Битовый образ — объект gdi
- •Создание битовых образов в программе
- •Формат монохромного битового образа
- •Формат цветного битового образа
- •Контекст памяти
- •Мощная функция BitBlt
- •Функция PatBlt
- •Координаты Blt
- •Перенос битов с помощью функции BitBlt
- •Функция DrawBitmap
- •Использование других rop кодов
- •Дополнительные сведения о контексте памяти
- •Преобразования цветов
- •Преобразования режимов отображения
- •Растяжение битовых образов с помощью функции StretchBlt
- •Кисти и битовые образы
- •Метафайлы
- •Простое использование метафайлов памяти
- •Сохранение метафайлов на диске
- •Расширенные метафайлы
- •Делаем это лучше
- •Базовая процедура
- •Заглянем внутрь
- •Вывод точных изображений
- •Текст и шрифты
- •Вывод простого текста
- •Атрибуты контекста устройства и текст
- •Использование стандартных шрифтов
- •Типы шрифтов
- •Шрифты TrueType
- •Система ezfont
- •Внутренняя работа
- •Форматирование простого текста
- •Работа с абзацами
Упакованный формат хранения dib
Если имеется файл DIB, который нужно прочитать в Windows-программе, вы можете считать его непосредственно в блок выделенной памяти. Этот блок известен как "Упакованный формат хранения DIB" (The packed-DIB Memory format). Он содержит все компоненты файла DIB, кроме структуры BITMAPFILEHEADER. Таким образом, этот блок памяти начинается со структуры информационного заголовка, затем следует таблица цветов (если она существует), затем непосредственно биты битового образа. Упакованный формат хранения DIB используется для копирования DIB в/из буфера обмена.
Вы можете также использовать упакованный формат хранения DIB для отображения битовых образов на экране, используя функции SetDIBitsToDevice или StretchDIBits, для создания кисти на базе DIB (CreateDIBPatternBrush) или для создания зависящего от устройства GDI битового образа (device dependent GDI bitmap) из DIB (CreateDIBitmap).
В любом случае вам следует вычислить адрес в глобальном блоке памяти, с которого начинаются биты битового образа. Вы можете это сделать, проверив поля структуры информационного заголовка и определив размер таблицы цветов.
Отображение dib
Windows имеет две функции для отображения DIB из блока памяти, хранящего упакованный формат DIB. Основная функция — это StretchDIBits, которая позволяет сжимать и растягивать битовый образ, и которая может реализовывать различные растровые операции, описываемые далее в этой главе. Функция SetDIBitsToDevice немного проще, поскольку она отображает битовый образ без растяжения или сжатия и не реализует растровые операции.
Обеим функциям требуется указатель на структуру BITMAPINFOHEADER — начало блока памяти DIB, и указатель на биты битового образа. Функция StretchDIBits обладает большими возможностями — позволяет вам отображать на экране любой прямоугольник с битовым образом с заданными логическими шириной и высотой.
Преобразование dib в объекты "битовые образы"
Если у вас 16-ти или 256-цветный дисплей, и вы хотите отобразить на нем полноцветный, 24 бита на пиксель, битовый образ, то вы заметите, что требуется некоторое время для его отображения. Это происходит потому, что драйвер устройства должен выполнить поиск ближайшего цвета для каждого пикселя битового образа.
Вы можете увеличить скорость отображения, преобразовав DIB в зависящий от устройства GDI битовый образ, используя функцию CreateDIBitmap. Поиск ближайшего цвета будет выполнен только один раз, а затем объект — битовый образ получит формат, соответствующий формату дисплея.
Несмотря на имя, функция CreateDIBitmap не строит DIB. Она создает зависящий от устройства объект GDI — битовый образ из описания DIB и возвращает описатель этого объекта. Этот битовый образ GDI совместим с устройством графического вывода, описатель которого передается функции в качестве первого параметра. Как и при отображении DIB, GDI должен преобразовать цвета, независящие от устройства, в цвета конкретного устройства.
Вслед за этим вызовом вы можете отображать битовый образ, выбирая его в контекст памяти (memory device context), и используя функцию BitBlt, как показано ниже в этой главе.
Вы можете также использовать функцию CreateDIBitmap для создания неинициализированного битового образа — объекта GDI:
hBitmap = CreateDIBitmap (hdc, &bmih, 0, NULL, NULL, 0);
Существуют также две функции для установки и чтения битов битового образа. Первая функция устанавливает биты:
SetDIBits (hdc, hBitmap, iStart, iNum, pBits, &bmi, iUsage);
Последние три параметра такие же, как у функции CreateDIBitmap. Параметр iStart определяет начальную скан-линию, адресуемую pBits. Он лежит в интервале от 0 (для нижней скан-линии) до высоты битового образа в пикселях — 1 (для верхней скан-линии). Параметр iNum задает число скан-линий, устанавливаемых в битовом образе.
Функция GetDIBits имеет такие же параметры:
GetDIBits (hdc, hBitmap, iStart, iNum, pBits, &bmi, iUsage);
В этом случае pBits указывает на буфер для записи битов битового образа. Функция устанавливает поля структуры BITMAPINFO для того, чтобы можно было определить размеры битового образа и таблицы цветов.