BITMAP

Тема в разделе "WASM.WIN32", создана пользователем cresta, 15 дек 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Как получить указатель на сами байты изображения в битмапе (т.е. массив r,g,b - значений). Когда-то делал изменение этих данных, хоть убей не могу вспомнить как :dntknw:

    Пробовал через поля BITMAP->bmBits, BITMAPINFO->bmiColors, безуспешно.
     
  2. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    Код (Text):
    1.  
    2. BitmapBits = offsetBitmapFIle + sizeof.BITMAPFILEHEADER
    3.                               + sizeof.BITMAPINFOHEADER
    4. if(BitmapInfoHeader.BitCount < 16){BitmapBits += (CountOfColors*4)}
    5.  




    На http://www.wotsit.org

    есть хорошое описание BMP, если нужно у меня есть переведённые(самопальные) структуры для FASM
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Same



    У меня битмап не в файле, я его сам создаю, и рисую в нем рисунок попиксельно. Примерно так сделал:
    Код (Text):
    1. BitmapProc proc uses ebx
    2.     LOCAL bi                :BITMAPINFO
    3.     LOCAL hBmp              :DWORD
    4.     LOCAL hDC               :DWORD
    5.     LOCAL mDC               :DWORD
    6.     LOCAL pBits             :DWORD
    7.    
    8. .data
    9.     bBytes      db 30000 dup(0)             ;100x100x3
    10. .code
    11.    
    12.     invoke  CreateCompatibleDC, NULL
    13.     mov     mDC,eax
    14.     mov     bi.bmiHeader.biSize,sizeof BITMAPINFOHEADER
    15.     mov     bi.bmiHeader.biWidth, 100
    16.     mov     bi.bmiHeader.biHeight,100
    17.     mov     bi.bmiHeader.biPlanes,1
    18.     mov     bi.bmiHeader.biBitCount,24
    19.     mov     bi.bmiHeader.biCompression,BI_RGB
    20.     invoke  CreateDIBSection, mDC, addr bi, DIB_RGB_COLORS, addr pBits, NULL, NULL
    21.     mov     hBmp,eax
    22.     invoke  SelectObject, mDC, hBmp
    23.     xor     ecx,ecx
    24.     @@:
    25.     mov     byte ptr[bBytes+ecx+0],cl       ;b
    26.     mov     byte ptr[bBytes+ecx+1],cl       ;g
    27.     mov     byte ptr[bBytes+ecx+2],cl       ;r
    28.     add     ecx,3
    29.     cmp     ecx,30000
    30.     jl     @B
    31.     invoke  GetDC,hWnd
    32.     mov     hDC,eax
    33.     invoke  SetDIBitsToDevice, hDC, 440, 200, bi.bmiHeader.biWidth, \
    34.          bi.bmiHeader.biHeight, 0, 0, 0, bi.bmiHeader.biHeight, addr bBytes, \
    35.          addr bi, DIB_RGB_COLORS
    36.     invoke  DeleteDC, mDC
    37.     invoke  ReleaseDC, hWnd, hDC
    38.     invoke  DeleteObject, hBmp
    39.     ret
    40.  
    41. BitmapProc endp
     
  4. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Может быть, GetDIBits?
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    SDragon

    Я тоже сначала прилепил GetDIBits в процедуру из предыдущего поста, а потом подумал, что это ни к чему, если битмап никуда не сохраняется. Полноценный битмап мне не нужен, а для вывода на экран SetDIBitsToDevice справляется и с простым массивом байт.



    P.S.

    Я наверное неправильно сформулировал вопрос :dntknw:

    Нужно было программно состряпать картинку и вывести на hDC. Первоначально подумал, что надо грузить битмап и править его биты, оказалось можно проще, непосредственно биты в hDC отправить.
     
  6. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    cresta

    Моно поподробней что делает SetDIBitsToDevice?
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
  8. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia


    Создаешь массив bBytes (возможно, динамический). Создаешь битмап, выбираешь его в HDC. Заполняешь структуру BITMAPINFOHEADER и делаешь SetDIBits:
    Код (Text):
    1.  
    2. hBMP = CreateCompatibleBitmap(hdc, width, height);
    3. holdBMP = SelectObject(hdc, hBMP);
    4. bi.biSize = sizeof(BITMAPINFOHEADER);
    5. bi.biPlanes = 1;
    6. bi.biBitCount = 32;
    7. bi.biCompression = BI_RGB;
    8. bi.biWidth = width;
    9. bi.biHeight = height;
    10. bi.biSizeImage = bi.biWidth * bi.biHeight * 4;
    11. SetDIBits(hdc, hBMP, 0, bi.biHeight, bBytes, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
    12.  
     
  9. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    cresta

    CreateDIBSection записывает указатель на область памяти выделенную для BITMAP'а, по адресу переданному в четвёртом параметре. Через него я записывал пиксели вполне успешно. Или я чего-то не понял в вопросе?
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Black_mirror

    Мне этот указатель не нужен. Как впрочем, и операции

    CreateCompatibleDC

    CreateCompatibleBitmap

    SelectObject

    CreateDIBSection



    Есть кусок памяти, в котором определенным образом расставляю байты (в соответствии с маской). Этот кусок передаю для непосредственного вывода на hDC в SetDIBitsToDevice, вместе со структурой BITMAPINFO, в которой указаны ширина, высота, глубина цвета и т.д.

    Тут пример как это делаю (в аттаче). Алфавит неполный, только цифры 0-5, и еще заполнение надо проверить,а то при нечетном количестве символов выводит с наклоном. Но принцип виден.



    [​IMG] _561642571__BitmapProc.asm
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Готовый пример рисования без

    CreateCompatibleDC

    CreateCompatibleBitmap

    SelectObject

    CreateDIBSection

    BitBlt

    DrawText

    e.t.c.



    [​IMG] 461862212__Draw.zip