Что такое код createdibitmap

Что такое код createdibitmap

Люди подскажите пожалуйста, вот столкнулся с такой проблемой:
Есть BMP, ее надо вывести на форму? КАК.
Смысл в том, что все это надо сделать через API не используя модуля Graphics и соответственно компонента TCanvas и TBitMap.
Пожалуйста с исходниками, или хотя бы примерно где искать.

CreateBitmap или что-то вроде этого.

CreateCompatibleBitmap
LoadBitMap
SelectObject
GetDC
BitBlt

вот вроде все нужные функции, но что с ними делать.

Read The Fucking Manual :)

По поводу вопроса, если только используя API —
нужно использовать не TBitmap (о котором Windows вообще ничего не знает) а HBitmap соответственно использовать функции CreateDibBitmap, контекст устройства HDC и BitBlt:

Создание:
Bitmap:=CreateDIBitmap( . );
.
Отрисовка

ps : TPAINTSTRUCT; // Переменная под структуру TPAINTSTRUCT
MemDC : hDC; // Контекст устройства
bm : TBitmap; // Переменная структуры TBitmap,
// не путать с классом TBitmap
.

BeginPaint(hWindow, ps);
MemDC:=CreateCompatibleDC(ps.hdc);
SelectObject(MemDC, Bitmap);
GetObject(Bitmap, sizeof(TBITMAP), @bm);
BitBlt(ps.hdc, 10, 10, bm.bmWidth, bm.bmHeight, MemDC, 0, 0, SRCCOPY);
DeleteDC(MemDC);
EndPaint(hWindow, ps);

P.S. Сразу видно, человек FIDO в глаза не видел.


> P.S. Сразу видно, человек FIDO в глаза не видел.

Это не про меня, надеюсь.

Совершенно верно НИКОГДА не видел, поэтому приходится учиться

Уважаемый дмитрия, может конечно мой вопрос прозвучит глупо, но пожалуйста примите во внимание то, что я пишу на Delphi всего 3 нет не года, месяца и мне сейчас позарез надо понять как вывести BMP на форму, поэтому мой вопрос состоит в следующем:

Что писать в функции CreateDIBitmap? вот это мне совершенно непонятно.

Есть такая функция как LoadBitMap, зачем она нужна
P.S. мне надо загрузить BMP из файла и вывести ее

Люди добрые не судите строго, я ведь только учусь

Спешил, потому много опечаток, не обижайтесь.

Ну лови код загрузки 24 bit DIB-а, я уверен, что тебе будет не понятна каждая строчка, но уж это такой дело — WinAPI не для тех кто сел за Delphi 3 мес. назад.

procedure LoadBitmap24bit(const hWindow: THandle);
var
F : File;
BitmapFileHeader : TBITMAPFILEHEADER;
BitmapInfoHeader : TBITMAPINFOHEADER;
BitmapInfo : TBitMapInfo;
BitmapBits : Pointer;
ReadCount : DWORD;
DC : HDC;
begin
AssignFile(F, Bitmap24bitFileName);
Reset(F, 1);

BlockRead(F, BitmapFileHeader, SizeOf(TBitmapFileHeader), ReadCount);
if (ReadCount <> SizeOf(TBitmapFileHeader)) then
begin
MessageBox(hWnd, «Ошибка чтения BITMAPFILEHEADER», «DIB From File Sample», MB_OK+MB_ICONERROR);
CloseFile(F);
Exit;
end;

BlockRead(F, BitmapInfoHeader, SizeOf(TBitmapInfoHeader), ReadCount);
if (ReadCount <> SizeOf(TBitmapInfoHeader)) then
begin
MessageBox(hWnd, «Ошибка чтения TBITMAPINFOHEADER», «DIB From File Sample», MB_OK+MB_ICONERROR);
CloseFile(F);
Exit;
end;

BlockRead(F, BitmapBits^, BitmapInfoHeader.biSizeImage, ReadCount);
if (ReadCount <> BitmapInfoHeader.biSizeImage) then
begin
MessageBox(hWnd, «Ошибка чтения данных файла.», «DIB From File Sample», MB_OK+MB_ICONERROR);
CloseFile(F);
Exit;
end;

DC:=GetDC(hWindow);
Bitmap:=CreateDIBitmap(DC,
BitmapInfoHeader,
CBM_INIT,
BitmapBits,
BitmapInfo,
DIB_RGB_COLORS);
ReleaseDC(hWindow, DC);

if Bitmap=0 then
MessageBox(hWnd, «Ошибка создания растра.», «DIB From File Sample», MB_OK+MB_ICONERROR);
CloseFile(F);
end;

В дагонку, LoadBitmap как раз и загружает BMP из внешнего файла, т.е. в примере выше я сам создаю HBitmap, а так у тебя сразу получается указатель на HBitmap;

CreateDIBitmap

Описание

function CreateDIBitmap(DC: HDC; var InfoHeader: TBitmapInfoHeader; Usage: Longint; InitBits: PChar; var InitInfo: TBitmapInfo; Usage: Word): HBitmap;

Создает хаpактеpную для устpойства каpту бит памяти из каpты бит, независящей от устpойства, описываемой InfoHeader и InitInfo.

Паpаметpы

  • DC: Контекст устpойства.
  • InfoHeader: TBitmapInfoHeader, описывающий pазмеp и фоpмат каpты бит.
  • Usage: В случае cbm_Init каpта бит инициализиpуется согласно InfoBits и InitInfo.
  • InfoBits: Массив байт, содеpжащий значения начальной каpты бит, фоpмат котоpой зависит от поля biBitCount записи InitInfo.
  • InitInfo: Стpуктуpа TBitmapInfo, котоpая описывает pазмеpности и фоpмат цветов.
  • Usage: Одна из констант DIB_RGB_Colors или DIB_Pal_Colors. См. pаздел «Идентификатоpы таблицы цветов, DIB_» в главе 1.

Возвpащаемое значение

В случае успешного завеpшения — идентификатоp каpты бит; 0 — в пpотивном случае.

Как получить Bitmap из HBITMAP

Если я правильно понял то нужно преобразовать HBITMAP в Bitmap, только как?

Добавлено через 38 минут
Вот этот код заработал, но скрин рабочего стола я не увидел.

08.02.2010, 11:29

HBITMAP и bitmap
У меня есть bitmap, как из него получить HBITMAP? HBITMAP hbm=bmp->Canvas->Handle;//Не работает.

Как получить цвет точки из HBITMAP
Как связать HBITMAP и GetPixel()/SetPixel? Мне нужно сделать фильтры для изображения, а я не знаю.

Рисование битмапов: (HBITMAP)SelectObject(hMemDC, hBitmap) выдаёт ошибку
Использовал пример из книг Фроловых «Библиотека системного программиста» рисование битовых.

Получить дескриптор HBITMAP
Для bmp-картинки, чтобы получить дескриптор HBITMAP, можно использовать функцию LoadImage. А как.

Как получить контекст устройства Bitmap?
Всем здравствуйте. Хочу рисовать на Bitmap средствами API. От Bitmap переходим к объекту.

С: WinAPI CreateDIBitmap () из байт [] задачи

Я работаю над этой проблемой в то время как сейчас.
Я пытаюсь добавить поддержку JPEG в программу с libjpeg.
По большей части, это работает довольно хорошо, но для некоторых JPEGs, они появляются как на картинке слева.

Это не может быть очевидным, но фон показывает с чередованием красных зеленых и синих строк. Если кто-нибудь видел такое поведение до и знает возможную причину, я был бы признателен за любой вклад.

Я проложенные строки, чтобы быть кратными четыре байта, и это лишь немного помог вопросу.

Решение: Я изменил преобразователь RGB / BGR к этому:

И он работал как шарм. Благодаря ROYGBIV .

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

Я считаю, что для Windows ожидает DWORD выровнены буфера.

Илон Маск рекомендует:  Цикл for

Одна проблема, которую я вижу с выше код, который вы не хотите использовать winRowSize скопировать фактические пикселей, вы хотите использовать переменную с (ширина изображения * байт на пиксель). копии winRowSize DWORD выровнены размер, который, вероятно, слишком большой (хотя некоторые изображения могут работать, как они падают на выравнивание DWORD по умолчанию.)

Изменение для цикла:

(Вы можете также отрегулировать RGB для BGR коды.)

Что такое код createdibitmap

Господа, у меня есть вопрос. Даже два. =(
Первый:
При написании VCL компонента столкнулся со странным поведением функции CreateDIBitmap — в некоторых случаях, возвращаемый хендл битмапа = 0, т.е. он попросту не создается.
Поясняю, компонент — эмулятор графического LCD дисплея. Его изображение хранится во внутреннем поле TBitmap и рисуется на канве компонента в методе Paint функцией Сanvas.StretchDraw(. ) (компонент унаследован от TCustomControl). Символы генерируются из массивов пикселов при разборе строки. Хранятся они вот так:

Вот код метода компонента, который создает двухцветную картинку(символ) из массива значений пикселов:

hBMP=0 я получаю в случаях, когда изменяю заданные по умолчанию значения количества строк, числа символов в строке, масштаба и т.д. По умолчанию у эмулятора 4 строки и 16 символов в строке. При изменении последних и появляются эти так сказать «артефакты», то есть некоторые символы-битмапы не создаются.. Какой-то закономерности или системы в этом я не обнаружил. =\

эти символы накладываются на основной битмап-экран (код метода разбора строки):

В чем тут может быть дело. Я что не освобождаю ресурсы API? Вариант попиксельно созданному битмапу присваивать значения из хранимых матриц реализовать было лень (хотя это наверное и проще зато медленнее). Кстати эти матрицы хранятся в отдельном модуле. Может быть их можно хранить как-то компактнее без потери скорости доступа??

А теперь вопрос второй, если вы еще не очень от меня устали 8) .
После создания из данного компонента ActiveX Control и регистрации в Дельфи он просто напросто отрисовывает свою рамку и больше ничего не отрисовывает , даже при условиях, когда VCL компонент работает отлично (без так сказать «артефактов»). Вай.
Заранее спасибо тем кто откликнется!
Надеюсь я был не слишком назойлив.
З.Ы. D6, Win2000 & XP

От: Dimonka
Дата: 14.11.05 17:25
Оценка:

Здравствуйте, siniypin, Вы писали:

S>Господа, у меня есть вопрос. Даже два. =(
S>Первый:
S>При написании VCL компонента столкнулся со странным поведением функции CreateDIBitmap — в некоторых случаях, возвращаемый хендл битмапа

Каждую такую строчку можно было как в старые добрые времена сделать одним байтом.

S>Вот код метода компонента, который создает двухцветную картинку(символ) из массива значений пикселов:

S>В чем тут может быть дело. Я что не освобождаю ресурсы API? Вариант попиксельно созданному битмапу присваивать значения из хранимых матриц реализовать было лень (хотя это наверное и проще зато медленнее). Кстати эти матрицы хранятся в отдельном модуле. Может быть их можно хранить как-то компактнее без потери скорости доступа??

Точно так же можно было обращаться к ScanLine битмапа, даже. наверное, чуток быстрее. В чем причина проблем с твоим кодом неохото разбираться..

От: Danchik
Дата: 14.11.05 17:31
Оценка:

Здравствуйте, siniypin, Вы писали:

Упростите для начала свою задачу:

Создайте ImageList, в который и накидай таблицу символов — проще будет работать с таблицей, да и не надо будет имплементить собственный Stotage.
Попробуйте нарисовать всю таблицу для дебага.
Разберитесь почему CreateDIBitmap не работает. Может pbi^.bmiHeader.biBitCount <> 32 (вы ведь создали 32 битный буфер).
Непонятно для чего вы создаете RGB картинку — вам проще было бы работать с Monohrome картинкой.

От: siniypin http://bobbbloggg.blogspot.com/ http://robbbloggg.blogspot.com/
Дата: 16.11.05 12:11
Оценка:

Здравствуйте, Dimonka, Вы писали:

D> (
D> ((1,1,1,1,1,1,1,1),//строки выровнены все норм..
D> (1,0,1,1,1,0,1,1),
D> .

D>Каждую такую строчку можно было как в старые добрые времена сделать одним байтом.
Критика уместна, но.. Каждую такую строчку мне все равно пришлось бы описать 4-мя байтами, 3 из которых были бы 0-ми. Так что объем хранимых данных уменьшился бы только в 2 раза, что по-моему не принципиально, вобщем что сделано то сделано.

D>Точно так же можно было обращаться к ScanLine битмапа, даже. наверное, чуток быстрее.
Согласен, что создавая VCL компонент логично пользоваться методами классов, которые эта самая VCL мне предоставляет.
Надо было бы сразу так и сделать.
А CreateDIBitmap корректно заработала, когда я явно указал, что я использую 2 цвета в полях biClrUsed = 2 и biClrImportant = 2. Забыл. =\

А вот второй вопрос все равно в силе. Попробовал создать «тупой » ActiveX, который при создании заполняет битмап рандомными значениями и рисует его на своей канве в перегруженом методе Paint, и все работает. А этот компонент кроме рамки больше ничего не рисует. Есть ли какой-нить способ отлаживать ActiveX, расставив точки останова в исходном VCL классе? (я так подозреваю, что нет).
Да.. а при вызове в коде метода ParseLine(aIndex: Integer; const aLine: WideString; aCurPos1: Integer; aCurPos2: Integer); который автоматически транслирован Дельфи при создании AX,
например:

ActiveX валится с «Разрушительным сбоем»! Тут-то в чем дело.

Заранее благодарен за ответ.

От: Danchik
Дата: 16.11.05 12:50
Оценка:

Здравствуйте, siniypin, Вы писали:

S>Есть ли какой-нить способ отлаживать ActiveX, расставив точки останова в исходном VCL классе? (я так подозреваю, что нет).

Почему же есть. И даже два.
Обьясню прицип одного, помоему самого простого:

1. Делаете ProgectGroup
2. Добавляете в нее ActiveX рrоject
3. Компилите ActiveX
4. Зарегистрируйте OCX файл (если еще не зарегистрен): regsvr32 MyActiveXControl.ocx
2. Создаете, так называемый, Loader.exe — проэкт который подымает вашу ActiveX. В него пожключаете Вашу MyActiveXControl_TLB.pas.
В лоадере пишем код создания ActiveX:

От: Dimonka
Дата: 16.11.05 13:17
Оценка:

Здравствуйте, Danchik, Вы писали:

D>[Skip]

D>Создайте ImageList, в который и накидай таблицу символов — проще будет работать с таблицей, да и не надо будет имплементить собственный Stotage.

Илон Маск рекомендует:  Профессиональный HTML и CSS

А ImageList можно сделать доступным для пользователя, чтобы он свои картинки мог подгружать

От: siniypin http://bobbbloggg.blogspot.com/ http://robbbloggg.blogspot.com/
Дата: 16.11.05 13:23
Оценка:
От: siniypin http://bobbbloggg.blogspot.com/ http://robbbloggg.blogspot.com/
Дата: 16.11.05 13:27
Оценка:

Здравствуйте, Dimonka, Вы писали:

D>Здравствуйте, Danchik, Вы писали:

D>>[Skip]

D>>Создайте ImageList, в который и накидай таблицу символов — проще будет работать с таблицей, да и не надо будет имплементить собственный Stotage.

D>А ImageList можно сделать доступным для пользователя, чтобы он свои картинки мог подгружать

Тогда это уже не эмулятор LCD экрана получится ))

От: Danchik
Дата: 16.11.05 14:43
Оценка:

Здравствуйте, siniypin, Вы писали:

S>Я может быть неправильно выразился. Вопрос был можно ли дебажить исходный VCL код при использовании созданного из него ActiveX. В приведенном Вами методе я дальше вызова методов DefaultInterface не проникаю. То есть вся работа компонента остается скрытой от меня.. Отсюда и вопросов столько.. =\

Посмотри в опции линковки твоего OCX:
Попробуй поключать Include TD32 debug info и Include remote debug symbols (оба на всякий пожарный). И сделай Build ALL.

Если у тебя Delphi 7 — проверь стоит ли у тебя update. В этой ветке

От: Dimonka
Дата: 16.11.05 14:50
Оценка:

Здравствуйте, siniypin, Вы писали:

S>Тогда это уже не эмулятор LCD экрана получится ))

Это будет эмулятор современного LCD экрана

От: PowerUserX
Дата: 17.11.05 06:51
Оценка:

насчет CreateDIBitmap.
Ты неверно инициализируешь
вот пример на VC+

typedef struct tagBITMAPINFO_MY
<
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[256];
>
BITMAPINFO_MY;

Как я получаю код ошибки от CreateDIBitmap () функция?

Я создаю битовый массив в своем использовании программы CreateDIBitmap, и это работало просто великолепно до сих пор. Я не знаю, почему, но внезапно HBITMAP, который это выкладывает, ПУСТОЙ, и я пытаюсь отладить это. Я пытался использовать HRESULT (не может), и GetLastError (не показал ошибки).

Есть ли способ получить код ошибки от этой функции?

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

Что такое код createdibitmap

Function CreateDIBitmap() creates a device-dependent bitmap from a device-independent bitmap. It’s difficult for me to understand the purpose of the function’s last argument, fuUsage = DIB_RGB _COLORS, or DIB_PAL_COLORS, knowing that the input bitmap is device-independent.

What I’m saying is, this information should already be available on the bitmap’s BITMAPINFOHEADER struct, whose address is passed as the function’s 2nd argument. As a matter of fact, it seems to be so, once we know that the BITMAPINFOHEADER member biClrUsed is different from 0, when the bmiColors color table is used for optimizing colors used on palette-based devices, and should be 0 otherwise, at least for biBitCount = 16, 24, or 32.

Maybe I’m missing something. Would appreciate some explanation.

To make things simpler, I’ll rephrase may question : could anyone give me an example where the function CreateDIBitmap is used with its last argument equal to DIB_PAL_COLORS ??

Ответы

such as a printer or some other device. When using RGB, and the device doesn’t support that color, it just finds the nearest color. Using PAL appears to let you control what colors are used when a device doesn’t support a specific color. I imagine this would be used mainly by drivers and graphics applications. I’ve never actually seen anyone use it myself.

Все ответы

If I recall correctly, DIB_PAL_COLORS specifies that your color table (bmiColors) are 16 bit pallete (of the device being selected to) lookups. And if I recall more correctly, that format is only supported as an internal Windows format and cannot be used for saving bitmap files. The description, to me, seems a little misleading. Since the palette appears to be from the device, it isn’t really device independent.

But the question still remains : «What is the purpose of this argument (DIB_PAL_COLORS) anyway ?» Or putting it another way, when would someone use the function CreateDIBitmap() with this argument ?

I was just wondering if this has anything do with the speed the bitmap is rendered on screen.

Thanks for your reply.

such as a printer or some other device. When using RGB, and the device doesn’t support that color, it just finds the nearest color. Using PAL appears to let you control what colors are used when a device doesn’t support a specific color. I imagine this would be used mainly by drivers and graphics applications. I’ve never actually seen anyone use it myself.

I read the article you suggested above. Very interesting and clarifying.

Many thanks for your help.

I am currently using the following routine to export an image which has transparent background from an Metafile. I am using the following routine. But the exported images has black background. Also please note that these images are transparent bitmap and pngs.

Is there any way to avoid black background, my intention is to have transparent background.

How to use BITMAPV5HEADER with CreateDIBitmap function

November 2020

276 раз

Я пытаюсь использовать BITMAPV5HEADER для создания растрового изображения , который имеет альфа — канал:

Но я не уверен , если тип литья правильно. CreateDIBitmap() Документация неясна, так как в определении поля он говорит:

lpbmih [в]
Указатель на структуру заголовка растровой информации, BITMAPV5HEADER.

1 ответы

Yes, the type-casts are fine.

The BITMAPV5HEADER documentation states:

The BITMAPV5HEADER structure is the bitmap information header file. It is an extended version of the BITMAPINFOHEADER structure.

The first 11 fields of BITMAPV5HEADER match the fields in BITMAPINFOHEADER . As such, you can safely pass in a type-casted BITMAPV5HEADER* pointer to the lpbmih parameter where a BITMAPINFOHEADER* pointer is expected.

Илон Маск рекомендует:  Атрибут xmlns в HTML

The lpbmi parameter, on the other hand, is another story. It is expecting a BITMAPINFO* pointer, but you are giving it a type-casted BITMAPV5HEADER* pointer instead. Technically, a BITMAPV5HEADER is not an extension of BITMAPINFO , so you should be passing in a separate BITMAPINFO variable instead of your BITMAPV5HEADER variable.

However, BITMAPINFO starts with a BITMAPINFOHEADER , so the first 11 fields of BITMAPV5HEADER will satisfy the BITMAPINFO::bmiHeader field. And you are setting the header’s biBitCount field to 32 and biCompression field to BI_RGB , so there is no color table used, so CreateDIBitmap() will not try to access the BITMAPINFO::bmiColors field and end up reading your BITMAPV5HEADER ‘s alpha/gamma fields as RGB values. So in this particular configuration, passing a type-casted BITMAPV5HEADER* pointer to the lpbmi parameter where a BITMAPINFO* pointer is expected is also «safe».

CreateDIBitmap

Описание: function CreateDIBitmap(DC: HDC; var InfoHeader: TBitmapInfoHeader; Usage:

Longint; InitBits: PChar; var InitInfo: TBitmapInfo; Usage: Word): HBitmap;

Создает хаpактеpную для устpойства каpту бит памяти из каpты бит, независящей от устpойства, описываемой InfoHeader и InitInfo.

Паpаметpы:

DC: Контекст устpойства.

InfoHeader: TBitmapInfoHeader, описывающий pазмеp и фоpмат каpты бит.

Usage: В случае cbm_Init каpта бит инициализиpуется согласно InfoBits и

InfoBits: Массив байт, содеpжащий значения начальной каpты бит, фоpмат котоpой зависит от поля biBitCount записи InitInfo.

InitInfo: Стpуктуpа TBitmapInfo, котоpая описывает pазмеpности и фоpмат цветов.

Usage: Одна из констант DIB_RGB_Colors или DIB_Pal_Colors. См. pаздел

«Идентификатоpы таблицы цветов, DIB_» в главе 1.

Возвpащаемое значение:

В случае успешного завеpшения — идентификатоp каpты бит; 0 — в пpотивном случае. функция находится в файле gdi32.dll

Программирование графики для Windows — Юань Ф.

Описанные выше функции не позволяют легко создать инициализированный цветной DDB-растр. Хотя при вызове CreateBitmap и CreateBitmapIndirect можно передать указатель на массив пикселов, сложность цветного изображения при этом не учитывается. С другой стороны, аппаратно-независимый растр обладает хорошими средствами для описания стандартных цветовых форматов. По этой причине в GDI была предусмотрена функция CreateDIBitmap, которая создает инициализированный DDB-растр на базе DIB, то есть в каком-то смысле преобразует DIB в DDB.

Функция CreateDIBitmap работает в два этапа: сначала она создает DDB, а затем преобразует DIB в DDB. В параметре hdc передается манипулятор эталонного контекста устройства, с которым должен быть совместим созданный DDB-растр. При передаче NULL создается монохромный DIB-растр. Параметр Ipbmih содержит указатель на структуру заголовка блока описания растра, но в ней используются только поля ширины и высоты. Если высота отрицательна, исполь-
570

Глава 10. Основные сведения о растрах

зуется абсолютное значение. Другие поля (такие, как количество бит на пиксел и режим сжатия) не используются.

Инициализация созданного DDB-растра необязательна и зависит от параметра fdwlnit. Если параметр равен CBMJNIT, следующие три параметра полностью описывают неупакованный DIB-растр. Параметр IpbInit указывает на массив пикселов, параметр Ipbmi — на заголовок блока описания растра, а параметр fuUsage сообщает, содержит ли цветовая таблица индексы палитры или цвета RGB.

Следующая функция класса KDIB преобразует DIB в DDB:

. HBITMAP ConvertToDDBCHDC hDC)

return CreateDIBitmapthDC1 & m_pBMI->bmiHeader.

CBMJNIT. m_pB1ts. m_pBMI, DIB_RGB_C0L0RS):

Если в процессе преобразования DIB в DDB задействована палитра, то используется текущая палитра, выбранная в контексте устройства.

В Windows-программировании растры обычно присоединяются к модулю в виде ресурса и затем загружаются в виде DDB функцией LoadBitmap.

Функция LoadBitmap получает два параметра: hlnstance — манипулятор модуля, содержащего растровый ресурс, и IpBitmapName — имя растрового ресурса. Если параметр hlnstance равен NULL, во втором параметре передаются константы OBM BTNCORNERS, OBM CHECK и т. д., определяющие десятки стандартных системных растров. Эти растры либо берутся непосредственно из модуля USER32.dll, либо синтезируются этим модулем. Если для идентификации растра в ресурсном файле используется целочисленный идентификатор, преобразование целого числа в указатель на символьную строку выполняется с помощью макроса MAKEINTRESOU RC E.

Растровые ресурсы хранятся в модулях Win32 в формате упакованного DIB-растра. Функция LoadBitmap находит растровый ресурс, фиксирует его в памяти для получения манипулятора упакованного DIB-растра и затем создает DDB-растр, совместимый с текущим экранным режимом. Для монохромных растров (то есть DIB-растров, у которых цветовая таблица содержит только черный и белый цвет) GDI использует монохромный формат DDB вместо цветного формата, увеличивающего затраты памяти. При работе в 256-цветном экранном режиме с палитрой загрузка изображений True Color и High Color приводит к ухудшению качества изображения, поскольку приложение не может управлять процессом преобразования цветов.

Код следующего фрагмента загружает растровое изображение панели инструментов из библиотеки BROWSEUI.dll:

HINSTANCE hMod = LoadLibraryt»browseui.dlI»);

HBITMAP hBmp — LoadBitmapthMod. MAKEINTRESOURCE1261)):

В документации Microsoft сказано, что в Windows 95 при использовании функции LoadBitmap возникают проблемы с загрузкой растров объемом более 64 Кбайт из-за базовой 16-разрядной реализации. Если размер ресурса DIB пре-
Аппаратно-зависимые растры

вышает 64 Кбайт, внутренняя реализация LoadBitmap преобразует его в 16-раз-рядное значение со сдвигом влево, что может привести к потере младших битов размера. Обходное решение заключается в дополнении ресурса нулями для округления размера.

В стандартной схеме применения LoadBitmap растр загружается и выводится один раз, после чего объект удаляется. Если вас беспокоит быстродействие программы, в эту схему можно внести изменения. Преобразование DIB в DDB выполняется медленно, a DDB тратит лишние системные ресурсы. В таких ситуациях быстрее и «дешевле» напрямую работать с DIB. Ho если растр загружается один раз и используется многократно, использование DDB может сэкономить время, затрачиваемое на преобразование формата растра.

Копирование растров между форматами DIB и DDB

Кроме функций для создания новых DDB-растров в GDI предусмотрены две функции для копирования пикселов между DDB и DIB.

int SetDIBltsIHDC hdc. HBITMAP hbmp. UINT uStartScan.

UINT cScanLines. CONST VOID * IpvBits.

CONST BITMAPINFO * lpbmi. UINT fuColorUse):

int GetDIBitstHDC hdc. HBITMAP hbmp. UINT uStartScan,

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL