GetDIBits немогу разобратся

Тема в разделе "WASM.BEGINNERS", создана пользователем 2FED, 23 апр 2009.

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    мне нужно получить массив пикселов, собрал из изсохдников вот такой код, но он не работает, ошибок никаких не выдаёт но в буффер ничего не пишется, помогите разобратся.

    Код (Text):
    1. LOCAL   rt:RECT
    2. LOCAL   pbuf[1024]:byte
    3. LOCAL   lpbi: BITMAPINFOHEADER
    4.  
    5. ....
    6.  
    7. invoke  GetWindowRect,hw_fix,addr rt
    8. invoke  CreateCompatibleDC,hwdc_fix
    9. mov hdcmem,eax
    10. mov eax,rt.right
    11. sub eax,rt.left
    12. mov rt.right,eax
    13. mov wdth,eax
    14. mov ecx,rt.bottom
    15. sub ecx,rt.top
    16. mov rt.bottom,ecx
    17. mov hght,ecx
    18. xor edx,edx
    19. mov rt.left,edx
    20. mov rt.top,edx
    21. invoke  CreateCompatibleBitmap,hwdc_fix,eax,ecx
    22. mov hbmp,eax
    23. invoke  SelectObject,hdcmem,hbmp
    24. mov hobj,eax
    25.  
    26. mov lpbi.biXPelsPerMeter, 0          
    27. mov lpbi.biYPelsPerMeter, 0
    28. mov lpbi.biClrUsed, 0  
    29. mov lpbi.biClrImportant, 0  
    30. mov eax, wdth
    31. mov lpbi.biWidth, eax  
    32. mov eax, hght
    33. mov lpbi.biHeight, eax                    
    34. mov eax, 100
    35. mov lpbi.biBitCount, ax
    36. mov lpbi.biSize, sizeof BITMAPINFOHEADER        
    37. mov lpbi.biPlanes, 1                                    
    38. mov lpbi.biCompression, BI_RGB
    39. mov lpbi.biSizeImage, 0  
    40.  
    41. invoke  RtlZeroMemory,addr pbuf,1024
    42. invoke  RtlMoveMemory,addr pbuf,addr lpbi,sizeof BITMAPINFOHEADER
    43.  
    44.  
    45. invoke  GetDIBits,hdcmem,hbmp,0,hght,0,addr pbuf,DIB_RGB_COLORS
     
  2. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Код (Text):
    1. mov eax, 100
    2. mov lpbi.biBitCount, ax
    Вот это я непонял. (0 бит на цвет)
     
  3. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Вот поторопился, а редактировать теперь видимо нельзя. Из твоего кода я вижу, что ты только запрашиваешь BITMAPINFOHEADER, а где сама попытка на получение массива?
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    низнаю, как правильно вызвать функцию? приведите пример пожалуйста.
     
  5. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Вот в свое время делал подобное, правда сам не допонимаю как все это работает.
    Код (Text):
    1.     invoke GlobalAlloc,GMEM_ZEROINIT,100352
    2.     mov hdcmem,eax
    3.     mov edi,eax
    4.     lea ebx,[eax+98304]
    5.     mov [ebx.BITMAPINFOHEADER].biSize,sizeof (BITMAPINFOHEADER)
    6.     mov [ebx.BITMAPINFOHEADER].biWidth,256
    7.     mov [ebx.BITMAPINFOHEADER].biHeight,128
    8.     mov [ebx.BITMAPINFOHEADER].biPlanes,1
    9.     mov [ebx.BITMAPINFOHEADER].biBitCount,24
    10.     mov [ebx.BITMAPINFOHEADER].biCompression,BI_RGB
    11.     mov [ebx.BITMAPINFOHEADER].biSizeImage,98304
    12.     mov [ebx.BITMAPINFOHEADER].biXPelsPerMeter,256
    13.     mov [ebx.BITMAPINFOHEADER].biYPelsPerMeter,128
    14.     mov [ebx.BITMAPINFOHEADER].biClrUsed,0
    15.     mov [ebx.BITMAPINFOHEADER].biClrImportant,0
    16.     mov dword ptr [ebx+40],0
    17.     ;Создаем растровое изображение по BITMAPINFOHEADER
    18.     invoke CreateDIBitmap,hdc,ebx,CBM_INIT,edi,ebx,DIB_RGB_COLORS
    19.     mov esi,eax
    20.     mov bmpmem1,eax
    21.     ;Считываем BITMAPINFOHEADER текущего hdc
    22.     invoke GetDIBits,hdc,eax,0,128,0,ebx,DIB_RGB_COLORS
    23.     ;Создаем растровое изображение совместимое с текущим hdc
    24.     invoke CreateCompatibleDC,hdc
    25.     mov bmpmem,eax
    26.     invoke SelectObject,eax,esi
    27.  
    28.     ;Здесь что нибудь рисуется в контекст bmpmem
    29.  
    30.     mov eax,hdcmem
    31.     add eax,98304
    32.     invoke GetDIBits,hdc,bmpmem1,0,128,hdcmem,ecx,DIB_RGB_COLORS    ;Здесь получаем массив
    33.     invoke DeleteObject,bmpmem
    34.     invoke DeleteObject,bmpmem1