В чём разница между объектом-битмапа и хендлом-битмапа

Тема в разделе "WASM.BEGINNERS", создана пользователем assch, 29 июн 2020.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    например функция (GdiPlus) - GdipCreateBitmapFromFile
    создаёт объект-битмапа
    а функцией (GdiPlus) - GdipCreateHBITMAPFromBitmap
    можно получить хендл-битмапа из этого объекта
    кто знает в чём разница между объектом-битмапа и хендлом-битмапа
     
  2. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Спасибо за ссылку - njeen,

    А вот скажем если есть хендл-битмапа
    то его можно скормить функции - GetObject
    и она соответсвенно заполнит структуру - BITMAP
    из которой мы узнаем некоторые детали битмапа

    bmBits - адрес начала битовой карты картинки
    bmWidth - ширина картинки
    bmHeight - высота картинки

    А вот имея объект-битмапа
    который можно получить функцией - GdipCreateBitmapFromFile
    как можно узнать ширину,высоту и главное адрес начала битовой карты
    или это можно сделать только если есть хендл-битмапа
    и соответственно только через функцию - GetObject
    мы унаем эти детали битмапа
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    assch, ты путаешь объекты GDI и объекты GDI+.

    Не всегда, только для DIB секций - читай описание функции:
    Размеры изображения можно получить через GdipGetImageWidth/GdipGetImageHeight.
    Чтобы получить доступ к непосредственно к битам изображения нужно использовать GdipBitmapLockBits/GdipBitmapUnlockBits.
     
  5. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Всем спасибо за участие в теме

    Я интересовался этим потому что в - OpenGL
    при инициализации например текстуры из картинки
    в частности у функции - glTexImage2D
    четвёртый и пятый параметр должны быть размеры (ширина и высота) картинки
    но это ерунда а вот последний девятый параметр должен быть
    адрес на начало битовой карты этой картинки

    Для этих целей я сделал пользовательскую функцию с тремя параметрами - GdipBitmap

    1 - параметр это адрес картинки (как требует GDI+ в формате UNICODE)
    2 - параметр это адрес на 16-байтовый буфер (там заполнятся четыре значения)
    3 - параметр (бонус) это флаг
    если (FALSE) - обычный битмап
    если (TRUE) - инвертированный битмап

    Для второго параметра я использую пользовательскую структуру - BITMAPDIB
    и подставляю её под переменную - bd
    Код (ASM):
    1.  
    2. struct bd=BITMAPDIB,bitmap,dib,x,y
    3.  
    Вызов функции
    Код (ASM):
    1.  
    2. fun GdipBitmap,u"OpenGL.bmp",&bd,0
    3.  
    после отработки функции
    заполняется буфер - bd

    bd.bitmap - хендл битмапа
    bd.dib - адрес на начало битовой карты
    bd.x - ширина
    bd.y - высота

    теперь эти значения можно подставлять в функцию
    Код (ASM):
    1.  
    2. fun glTexImage2D,GL_TEXTURE_2D,0,GL_RGB8,bd.x,bd.y,0,GL_BGRA_EXT,GL_UNSIGNED_BYTE,bd.dib
    3.  
    после можно уничтожить и сам битмам
    Код (ASM):
    1.  
    2. fun DeleteObject,bd.bitmap
    3.  
    сама пользовательская функция
    Код (ASM):
    1.  
    2. @Fun GdipBitmap ebx,p(3)
    3. local BitmapL,HBitmapL,bmL:BITMAP
    4.  
    5. fun GdipCreateBitmapFromFile,p1,&BitmapL
    6. fun GdipCreateHBITMAPFromBitmap,BitmapL,&HBitmapL,0
    7. fun GdipDisposeImage,BitmapL
    8. fun GetObject,HBitmapL,BITMAP,&bmL
    9.  
    10. if p2
    11. mov ecx,p2
    12. mov [ecx]=HBitmapL
    13. mov [ecx+4]=bmL.bmBits
    14. mov [ecx+8]=bmL.bmWidth
    15. mov [ecx+12]=bmL.bmHeight
    16. endif
    17.  
    18. if p3
    19. mov ebx=bmL.bmWidth*bmL.bmHeight*4
    20. mov edx,bmL.bmBits
    21. while ebx
    22. mov cl,255
    23. mov al,byte ptr [edx]
    24. sub cl,al
    25. mov byte ptr [edx],cl
    26. inc edx
    27. dec ebx
    28. endw
    29. endif
    30.  
    31. @End HBitmapL
    32.  
    Функция на выходе дополнительно вернёт хендл-битмапа
    Синтаксис написания отличается от класического - masm32
    это мой пользовательский синтаксис
    я в шутку называю его - masm32+
    В любом случае интуитивно здесь я думаю всё понятно
    Когда я создавал тему я думал что в моей функции
    можно что то упростить
    но чуда не произошло
     
  6. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    ну это как разница между чемоданом и ручкой, за которую его тянешь
     
  7. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    Ну так GDI+ позволяет создать растр на основе битовой карты GdipCreateBitmapFromScan0
     
  8. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Честно говоря не понял как это может оптимизировать пример моей функции
    скорее наоборот утяжелит алгоритм
     
  9. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    assch, если тебе нужно непосредственно из gdi+ изображения получить биты то ты используешь GdipBitmapLockBits/GdipBitmapUnlockBits. Если тебе нужно создать gdi+ изображения из битов то используешь GdipCreateBitmapFromScan0
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    assch,

    > можно получить хендл-битмапа из этого объекта

    Обьект это ядерный механизм, который имеет структуру. В ядре обьяктом является адрес структуры обьекта. Описатель это локальная ссылка на обьект. Для гуя описатели отличаются от базового нэйтив, это сделано для оптимизации доступа к телу обьекта. Их ядерная часть частично отображена на юзер и гуй транслирует описатель на указатель без вызова ядра, манипулируя юзер памятью.

    Какое к этому вопросу имеют отношения винапи которых накидали я не понимаю.
     
  11. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Удивительно конечно такое не понимание
    в пятом посте предельно ясно дано понять для чего возникла эта тема

    Главное адрес битовой карты картинки
    для того чтобы работать с примерами по OpenGL
    по этому я думал что можно как то ещё это сделать то есть попроще или пооптимальней
     
    Последнее редактирование: 2 июл 2020
  12. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    860
    Я уже написал как. Загружаешь растр GdipCreateBitmapFromFile, лочишь и получаешь доступ к пикселам GdipBitmapLockBits. Это проще т.к. не нужно делать лишних переводов из Bitmap в HBITMAP и дублировать данные.
     
  13. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Всем ещё раз спасибо что поддержали тему
    попробую применить советы

    Век живи век учись!