отрисовка png картинки с альфа каналом

Тема в разделе "WASM.BEGINNERS", создана пользователем teribal, 1 апр 2010.

  1. teribal

    teribal New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2009
    Сообщения:
    15
    Код (Text):
    1. invoke  GdiplusStartup, token, input, 0
    2.         test    eax,eax
    3.         jnz     exit
    4.  
    5. invoke  GdipGetImageEncodersSize, encoders_count, encoders_size
    6.         test    eax,eax
    7.         jnz     gdiplus_shutdown
    8. invoke  VirtualAlloc,0, [encoders_size], MEM_COMMIT, PAGE_READWRITE
    9.         test    eax,eax
    10.         jz      gdiplus_shutdown
    11.         mov     ebx,eax
    12. invoke  GdipGetImageEncoders, [encoders_count], [encoders_size], ebx
    13.         test    eax,eax
    14.         jnz     gdiplus_shutdown
    15.     scan_encoders:
    16.         mov     esi,[ebx+ImageCodecInfo.MimeType]
    17.         mov     edi,encoder_mimetype
    18.         mov     ecx,10
    19.         repe    cmpsw
    20.         je      encoder_found
    21.         add     ebx,sizeof.ImageCodecInfo
    22.         dec     [encoders_count]
    23.         jnz     scan_encoders
    24.         ; no encoder found
    25.         jmp     gdiplus_shutdown
    26.      encoder_found:
    27.         lea     esi,[ebx+ImageCodecInfo.Clsid]
    28.         mov     edi,encoder_clsid
    29.         mov     ecx,4
    30.         rep     movsd
    31. invoke  VirtualFree, ebx, 0, MEM_RELEASE
    32.  
    33.  
    34. invoke  GdipCreateBitmapFromFile, filename, gdip_bitmap
    35. invoke  GdipSaveImageToFile, [gdip_bitmap], filename2, encoder_clsid, 0
    36.  
    37.         invoke  GdipDisposeImage, [gdip_bitmap]
    38.   gdiplus_shutdown:
    39.         invoke  GdiplusShutdown, [token]
    40.  
    41.  
    42. ;...
    43.   filename2 du 'test.png',0
    44.   encoder_mimetype du 'image/png',0
    45.  
    46.   input GdiplusStartupInput 1
    47.   encoder_clsid db 16 dup ?
    48.  
    49.   token dd ?
    50.   gdip_bitmap dd ?
    51.  
    52.   encoders_count dd ?
    53.   encoders_size dd ?
    После запуска рядом с png рисунком появляется ещё один, тоже с прозрачностью.
    Дальше добавил в конце:
    invoke GdipCreateHBITMAPFromBitmap,[gdip_bitmap],hBitmap,0
    invoke GetDC,[hWin]
    invoke BitBlt,eax,0,0,32,32,[gdip_bitmap],20,20,SRCCOPY
    Не получилось.

    Пробовал с помощью pnglib. Удобно, но там рисуется вся картинка, без "прозрачности". Помогите пожалуйста.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Сделал тестовый проект, с gdiplus до этого не работал, всё заработало сразу.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
  4. teribal

    teribal New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2009
    Сообщения:
    15
    Спасибо за примеры.
    Оказалось достаточно всего 4 строки, чтобы нарисовать картинку:
    Код (Text):
    1. invoke  GdiplusStartup,token,input,0
    2. invoke GdipCreateFromHWND, [hWin], graphics
    3. invoke GdipDrawImageRect, [graphics], [gdip_bitmap], 0, 0, 64.0, 64.0
    4. invoke GdipDisposeImage,[gdip_bitmap]
    А как можно отрисовать png который не на диске и не в ресурсах, а в памяти по адресу 420000h, не сохраняя его на диск?
     
  5. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Посмотрите на функцию BitmapFromMemory из masm32\m32lib\bitmapfrommemory.asm.
     
  6. Phyber

    Phyber New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
  7. teribal

    teribal New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2009
    Сообщения:
    15
    Готово. Сделал как в BitmapFromMemory:
    Код (Text):
    1. invoke  GdiplusStartup,token,input,0
    2. mov ebx,3478
    3.  invoke CoTaskMemAlloc,ebx
    4.  xor ecx,ecx
    5.  mov esi,samplefile
    6.  @@:
    7.  mov edx,dword[esi+ecx]
    8.  mov dword[eax+ecx],edx
    9.  add ecx,4
    10.  cmp ecx,ebx
    11.  jb @B
    12.  
    13. invoke CreateStreamOnHGlobal,eax,1,hStream
    14. invoke GdipCreateBitmapFromStream,[hStream],gdip_bitmap
    15. invoke GdipCreateFromHWND,[hWin],graphics
    16. invoke GdipDrawImageRect,[graphics],[gdip_bitmap],0,0,64.0,64.0
    17. invoke GdiplusShutdown,[token]