например функция (GdiPlus) - GdipCreateBitmapFromFile создаёт объект-битмапа а функцией (GdiPlus) - GdipCreateHBITMAPFromBitmap можно получить хендл-битмапа из этого объекта кто знает в чём разница между объектом-битмапа и хендлом-битмапа
вот ленивый народ пошел :/ https://docs.microsoft.com/en-us/windows/win32/sysinfo/handles-and-objects
Спасибо за ссылку - njeen, А вот скажем если есть хендл-битмапа то его можно скормить функции - GetObject и она соответсвенно заполнит структуру - BITMAP из которой мы узнаем некоторые детали битмапа bmBits - адрес начала битовой карты картинки bmWidth - ширина картинки bmHeight - высота картинки А вот имея объект-битмапа который можно получить функцией - GdipCreateBitmapFromFile как можно узнать ширину,высоту и главное адрес начала битовой карты или это можно сделать только если есть хендл-битмапа и соответственно только через функцию - GetObject мы унаем эти детали битмапа
assch, ты путаешь объекты GDI и объекты GDI+. Не всегда, только для DIB секций - читай описание функции: Размеры изображения можно получить через GdipGetImageWidth/GdipGetImageHeight. Чтобы получить доступ к непосредственно к битам изображения нужно использовать GdipBitmapLockBits/GdipBitmapUnlockBits.
Всем спасибо за участие в теме Я интересовался этим потому что в - OpenGL при инициализации например текстуры из картинки в частности у функции - glTexImage2D четвёртый и пятый параметр должны быть размеры (ширина и высота) картинки но это ерунда а вот последний девятый параметр должен быть адрес на начало битовой карты этой картинки Для этих целей я сделал пользовательскую функцию с тремя параметрами - GdipBitmap 1 - параметр это адрес картинки (как требует GDI+ в формате UNICODE) 2 - параметр это адрес на 16-байтовый буфер (там заполнятся четыре значения) 3 - параметр (бонус) это флаг если (FALSE) - обычный битмап если (TRUE) - инвертированный битмап Для второго параметра я использую пользовательскую структуру - BITMAPDIB и подставляю её под переменную - bd Код (ASM): struct bd=BITMAPDIB,bitmap,dib,x,y Вызов функции Код (ASM): fun GdipBitmap,u"OpenGL.bmp",&bd,0 после отработки функции заполняется буфер - bd bd.bitmap - хендл битмапа bd.dib - адрес на начало битовой карты bd.x - ширина bd.y - высота теперь эти значения можно подставлять в функцию Код (ASM): fun glTexImage2D,GL_TEXTURE_2D,0,GL_RGB8,bd.x,bd.y,0,GL_BGRA_EXT,GL_UNSIGNED_BYTE,bd.dib после можно уничтожить и сам битмам Код (ASM): fun DeleteObject,bd.bitmap сама пользовательская функция Код (ASM): @Fun GdipBitmap ebx,p(3) local BitmapL,HBitmapL,bmL:BITMAP fun GdipCreateBitmapFromFile,p1,&BitmapL fun GdipCreateHBITMAPFromBitmap,BitmapL,&HBitmapL,0 fun GdipDisposeImage,BitmapL fun GetObject,HBitmapL,BITMAP,&bmL if p2 mov ecx,p2 mov [ecx]=HBitmapL mov [ecx+4]=bmL.bmBits mov [ecx+8]=bmL.bmWidth mov [ecx+12]=bmL.bmHeight endif if p3 mov ebx=bmL.bmWidth*bmL.bmHeight*4 mov edx,bmL.bmBits while ebx mov cl,255 mov al,byte ptr [edx] sub cl,al mov byte ptr [edx],cl inc edx dec ebx endw endif @End HBitmapL Функция на выходе дополнительно вернёт хендл-битмапа Синтаксис написания отличается от класического - masm32 это мой пользовательский синтаксис я в шутку называю его - masm32+ В любом случае интуитивно здесь я думаю всё понятно Когда я создавал тему я думал что в моей функции можно что то упростить но чуда не произошло
Честно говоря не понял как это может оптимизировать пример моей функции скорее наоборот утяжелит алгоритм
assch, если тебе нужно непосредственно из gdi+ изображения получить биты то ты используешь GdipBitmapLockBits/GdipBitmapUnlockBits. Если тебе нужно создать gdi+ изображения из битов то используешь GdipCreateBitmapFromScan0
assch, > можно получить хендл-битмапа из этого объекта Обьект это ядерный механизм, который имеет структуру. В ядре обьяктом является адрес структуры обьекта. Описатель это локальная ссылка на обьект. Для гуя описатели отличаются от базового нэйтив, это сделано для оптимизации доступа к телу обьекта. Их ядерная часть частично отображена на юзер и гуй транслирует описатель на указатель без вызова ядра, манипулируя юзер памятью. Какое к этому вопросу имеют отношения винапи которых накидали я не понимаю.
Удивительно конечно такое не понимание в пятом посте предельно ясно дано понять для чего возникла эта тема Главное адрес битовой карты картинки для того чтобы работать с примерами по OpenGL по этому я думал что можно как то ещё это сделать то есть попроще или пооптимальней
Я уже написал как. Загружаешь растр GdipCreateBitmapFromFile, лочишь и получаешь доступ к пикселам GdipBitmapLockBits. Это проще т.к. не нужно делать лишних переводов из Bitmap в HBITMAP и дублировать данные.