Понимание GetDiBits. C++

MSDN говорит, что растровое изображение используется в GetDiBits не должен быть выбран в DC перед вызовом этой функции. Но из моего опыта (с BitBltЯ знаю, что не могу нарисовать растровое изображение, если оно не выбрано.

  1. Как GetDiBits обойти это? Могу ли я просто использовать невыбранный, недавно созданный растровое изображение в качестве аргумента этой функции?
  2. GetDiBits также CreateDibSection возвращает массив. Но MSDN говорит о первой функции:

    "биты указанного совместимого растрового изображения"

    Я думал, что DI обозначает DeviceIndependent. Почему есть противоречие? Это означает, что, согласно MSDN, GetDiBits может использоваться только с CreateCompatibleBitmap (что ДД)? Тогда я не могу отправить этот массив на другую машину, чтобы отобразить его, верно?

  3. Обе функции используют постоянный ток. Если CreateDibSection действительно зависит от того, зачем ему нужен hDC? Вся необходимая информация предоставляется через bitmapinfoheader...

1 ответ

Решение
  1. Я не могу нарисовать растровое изображение, если оно не выбрано. Как GetDiBits обходит это?

GetDIBits не рисует. Он считывает данные пикселей из растрового изображения и преобразует их в нужный цветовой формат. SetDIBits тоже не "рисует", но устанавливает пиксельные данные в растровое изображение.

  1. Смущение имен.

DI в GetDIBitmap относится к тому факту, что данные пикселей возвращаются в независимом от устройства формате (в частности, в том, который вы запрашиваете). Исходное растровое изображение может быть совместимым растровым изображением или независимым от устройства растровым изображением.

Точно так же SetDIBitmap берет независимые от устройства данные пикселей и преобразует их в тип целевого растрового изображения.

Эти функции озадаченно названы.

  1. Для чего нужен DC?

DC используется для ответа на любые вопросы о формате пикселей на устройстве. Например, если исходный формат представляет собой зависящее от устройства растровое изображение на основе палитры, GetDIBits будет считать, что палитра, выбранная в DC, является правильной. Обратите внимание, что палитра не находится в BITMAPINFOHEADER.

CreateDIBSection создает гибридное растровое изображение, которое хранит данные в независимом от устройства методе, но может также синхронизировать зависящую от устройства копию с ним для повышения производительности. Таким образом, он должен знать DC предполагаемого устройства.

Другие вопросы по тегам