Понимание GetDiBits. C++
MSDN говорит, что растровое изображение используется в GetDiBits
не должен быть выбран в DC перед вызовом этой функции. Но из моего опыта (с BitBlt
Я знаю, что не могу нарисовать растровое изображение, если оно не выбрано.
- Как
GetDiBits
обойти это? Могу ли я просто использовать невыбранный, недавно созданный растровое изображение в качестве аргумента этой функции? GetDiBits
такжеCreateDibSection
возвращает массив. Но MSDN говорит о первой функции:"биты указанного совместимого растрового изображения"
Я думал, что DI обозначает DeviceIndependent. Почему есть противоречие? Это означает, что, согласно MSDN,
GetDiBits
может использоваться только сCreateCompatibleBitmap
(что ДД)? Тогда я не могу отправить этот массив на другую машину, чтобы отобразить его, верно?- Обе функции используют постоянный ток. Если
CreateDibSection
действительно зависит от того, зачем ему нужен hDC? Вся необходимая информация предоставляется через bitmapinfoheader...
1 ответ
- Я не могу нарисовать растровое изображение, если оно не выбрано. Как GetDiBits обходит это?
GetDIBits не рисует. Он считывает данные пикселей из растрового изображения и преобразует их в нужный цветовой формат. SetDIBits тоже не "рисует", но устанавливает пиксельные данные в растровое изображение.
- Смущение имен.
DI в GetDIBitmap относится к тому факту, что данные пикселей возвращаются в независимом от устройства формате (в частности, в том, который вы запрашиваете). Исходное растровое изображение может быть совместимым растровым изображением или независимым от устройства растровым изображением.
Точно так же SetDIBitmap берет независимые от устройства данные пикселей и преобразует их в тип целевого растрового изображения.
Эти функции озадаченно названы.
- Для чего нужен DC?
DC используется для ответа на любые вопросы о формате пикселей на устройстве. Например, если исходный формат представляет собой зависящее от устройства растровое изображение на основе палитры, GetDIBits будет считать, что палитра, выбранная в DC, является правильной. Обратите внимание, что палитра не находится в BITMAPINFOHEADER.
CreateDIBSection создает гибридное растровое изображение, которое хранит данные в независимом от устройства методе, но может также синхронизировать зависящую от устройства копию с ним для повышения производительности. Таким образом, он должен знать DC предполагаемого устройства.