mkdir

Тема в разделе "WASM.BEGINNERS", создана пользователем hakeem, 24 авг 2008.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Заметил значение Вашего GUID'а только после того, как написал свой пример. GUID энкодера и GUID формата - это вроде как не одно и то же.
    Огромное преимущество GDI+ в том, что достаточно всего лишь заменить GUID и получите любой поддерживаемый формат. А геморрой с заголовками - одноразовый, причем BMP - это простейший случай. Вот пример на фасме для BMP:
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32a.inc'
    4.  
    5. struct GdiplusStartupInput
    6.    GdiplusVersion           dd ?
    7.    DebugEventCallback       dd ?
    8.    SuppressBackgroundThread dd ?
    9.    SuppressExternalCodecs   dd ?
    10. ends
    11. struct EncoderParameter
    12.    GUID                     dd 4 dup ?
    13.    NumberOfValues           dd ?
    14.    Type                     dd ?
    15.    Value                    dd ?
    16. ends
    17. struct EncoderParameters
    18.    Count                    dd ?
    19.    Parameter                EncoderParameter <>
    20. ends
    21.  
    22. main:
    23.    invoke GetWindowDC,0
    24.    mov dword[DesktopDC],eax
    25.       invoke GetSystemMetrics,SM_CXSCREEN
    26.       mov esi,eax                             ;esi - screen width
    27.       invoke GetSystemMetrics,SM_CYSCREEN
    28.       mov edi,eax                             ;edi - screen height
    29.       invoke CreateCompatibleBitmap,[DesktopDC],esi,edi
    30.       mov dword[hDeskBMP],eax
    31.          invoke CreateCompatibleDC,[DesktopDC]
    32.          mov dword[dcDeskBMP],eax
    33.             invoke SelectObject,[dcDeskBMP],[hDeskBMP]
    34.             mov dword[hPrevObject],eax
    35.             invoke BitBlt,[dcDeskBMP],0,0,esi,edi,[DesktopDC],0,0,SRCCOPY
    36.             mov dword[tSI.GdiplusVersion],1
    37.             invoke GdiplusStartup,tGDIP,tSI
    38.                invoke GdipCreateBitmapFromHBITMAP,[hDeskBMP],0,frDesktopBitmap
    39.                   invoke GdipSaveImageToFile,[frDesktopBitmap],fPath,GUIDImageEncoderBMP,NULL
    40.                invoke GdipDisposeImage,[frDesktopBitmap]
    41.             invoke GdiplusShutdown,[tGDIP]
    42.          invoke DeleteDC,[dcDeskBMP]
    43.       invoke DeleteObject,[hDeskBMP]
    44.    invoke ReleaseDC,0,[DesktopDC]
    45. invoke ExitProcess,0
    46.  
    47. fPath du 'C:\Bitmap.bmp',0
    48.  
    49. GUIDImageEncoderBMP:   dd 557CF400h
    50.                        dw 1A04h,11D3h
    51.                        db 09Ah,073h,000h,000h,0F8h,01Eh,0F3h,02Eh
    52.  
    53. data import
    54.         library kernel32,'kernel32.dll',\
    55.                 user32,'user32.dll',\
    56.                 gdi32,'gdi32.dll',\
    57.                 gdiplus,'gdiplus.dll'
    58.  
    59.         import kernel32,\
    60.                 CloseHandle,'CloseHandle',\
    61.                 ExitProcess,'ExitProcess'
    62.         import user32,\
    63.                 GetWindowDC,'GetWindowDC',\
    64.                 ReleaseDC,'ReleaseDC',\
    65.                 GetSystemMetrics,'GetSystemMetrics'
    66.         import gdi32,\
    67.                 CreateCompatibleDC,'CreateCompatibleDC',\
    68.                 DeleteDC,'DeleteDC',\
    69.                 CreateCompatibleBitmap,'CreateCompatibleBitmap',\
    70.                 DeleteObject,'DeleteObject',\
    71.                 SelectObject,'SelectObject',\
    72.                 BitBlt,'BitBlt'
    73.         import gdiplus,\
    74.                 GdipCreateBitmapFromHBITMAP,'GdipCreateBitmapFromHBITMAP',\
    75.                 GdipDisposeImage,'GdipDisposeImage',\
    76.                 GdiplusStartup,'GdiplusStartup',\
    77.                 GdiplusShutdown,'GdiplusShutdown',\
    78.                 GdipSaveImageToFile,'GdipSaveImageToFile'
    79. end data
    80.  
    81. align 4
    82.  
    83. DesktopDC              dd ?
    84. hDeskBMP               dd ?
    85. dcDeskBMP              dd ?
    86. hPrevObject            dd ?
    87. tSI                    GdiplusStartupInput <>
    88. tGDIP                  dd ?
    89. bytesWritten           dd ?
    90. frDesktopBitmap        dd ?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    l_inc
    Да спасибо - с правильным GUID и у меня заработало, только почему-то в инклюдах из SDK Win Server 2003 этого гуида не оказалось, потому и задействавал то что в них нашлось (а перечислялку слепить поленился ;)
    Что GDI+ весчь замечательная и очень удобная это я не спорю ;) Но есть в ней коварные ньюансы из-за которых имхо начинать осваивать её на асме стоит после того как ТС будет более менее уверенно ориентироваться в обычных api и англоязычных доках ;)

    Кстати связка GdipCreateBitmapFromHBITMAP + GdipSaveImageToFile по умолчанию сохраняет bitmap не в формате исходного изображения, а в 32 битном виде без палитры, даже если исходная картинка двухцветная ;) так что для красивого решения задачи придётся всё таки определить параметры bitmapa и соответсвующим образом настроить кодек (кстати я так и не понял как это делается даже применительно к "простейшему случаю" - в msdn/psdk пример только для качества jpg, да и то какой-то мутный - на досуге помедитирую ;)
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Я так думаю, что и не должно было. :) С чего бы рекомендовать его искать перечислением и при этом объявлять в хэдерах? Видимо, я в своё время тоже из сети брал. Хотя и перечисление тоже не более десяти строк, а то и меньше:
    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32a.inc'
    4.  
    5. struct GdiplusStartupInput
    6.    GdiplusVersion           dd ?
    7.    DebugEventCallback       dd ?
    8.    SuppressBackgroundThread dd ?
    9.    SuppressExternalCodecs   dd ?
    10. ends
    11. struct ImageCodecInfo
    12.    Clsid                    dd 4 dup ?
    13.    FormatID                 dd 4 dup ?
    14.    CodecName                dd ?
    15.    DllName                  dd ?
    16.    FormatDescription        dd ?
    17.    FilenameExtension        dd ?
    18.    MimeType                 dd ?
    19.    Flags                    dd ?
    20.    Version                  dd ?
    21.    SigCount                 dd ?
    22.    SigSize                  dd ?
    23.    SigPattern               dd ?
    24.    SigMask                  dd ?
    25. ends
    26. struct EncoderParameter
    27.    GUID                     dd 4 dup ?
    28.    NumberOfValues           dd ?
    29.    Type                     dd ?
    30.    Value                    dd ?
    31. ends
    32. struct EncoderParameters
    33.    Count                    dd ?
    34.    Parameter                EncoderParameter <>
    35. ends
    36.  
    37. main:
    38.    invoke GetWindowDC,0
    39.    mov dword[DesktopDC],eax
    40.       invoke GetSystemMetrics,SM_CXSCREEN
    41.       mov esi,eax                             ;esi - screen width
    42.       invoke GetSystemMetrics,SM_CYSCREEN
    43.       mov edi,eax                             ;edi - screen height
    44.       invoke CreateCompatibleBitmap,[DesktopDC],esi,edi
    45.       mov dword[hDeskBMP],eax
    46.          invoke CreateCompatibleDC,[DesktopDC]
    47.          mov dword[dcDeskBMP],eax
    48.             invoke SelectObject,[dcDeskBMP],[hDeskBMP]
    49.             invoke BitBlt,[dcDeskBMP],0,0,esi,edi,[DesktopDC],0,0,SRCCOPY
    50.             mov dword[tSI.GdiplusVersion],1
    51.             invoke GdiplusStartup,tGDIP,tSI
    52.                invoke GdipCreateBitmapFromHBITMAP,[hDeskBMP],0,frDesktopBitmap
    53.                   invoke GdipGetImageEncodersSize,encNum,encSize
    54.                   invoke VirtualAlloc,0,[encSize],MEM_COMMIT,PAGE_READWRITE
    55.                   mov ebx,eax                                ;ebx - pointer to encoders info memory
    56.                      invoke GdipGetImageEncoders,[encNum],[encSize],eax
    57.                      lea ebp,[ebx-sizeof.ImageCodecInfo]     ;ebp - current encoder being enumerated
    58.                      @@:
    59.                         add ebp,sizeof.ImageCodecInfo
    60.                         invoke lstrcmpW,[ebp+ImageCodecInfo.MimeType],encoderMIME
    61.                         test eax,eax
    62.                      jnz @B
    63.                      invoke GdipSaveImageToFile,[frDesktopBitmap],fPath,ebp,NULL
    64.                   invoke VirtualFree,ebx,0,MEM_RELEASE
    65.                invoke GdipDisposeImage,[frDesktopBitmap]
    66.             invoke GdiplusShutdown,[tGDIP]
    67.          invoke DeleteDC,[dcDeskBMP]
    68.       invoke DeleteObject,[hDeskBMP]
    69.    invoke ReleaseDC,0,[DesktopDC]
    70. invoke ExitProcess,0
    71.  
    72. fPath           du 'C:\Bitmap.bmp',0
    73. encoderMIME     du 'image/bmp',0
    74.  
    75. data import
    76.         library kernel32,'kernel32.dll',\
    77.                 user32,'user32.dll',\
    78.                 gdi32,'gdi32.dll',\
    79.                 gdiplus,'gdiplus.dll'
    80.  
    81.         import kernel32,\
    82.                 VirtualAlloc,'VirtualAlloc',\
    83.                 VirtualFree,'VirtualFree',\
    84.                 ExitProcess,'ExitProcess',\
    85.                 lstrcmpW,'lstrcmpW'
    86.         import user32,\
    87.                 GetWindowDC,'GetWindowDC',\
    88.                 ReleaseDC,'ReleaseDC',\
    89.                 GetSystemMetrics,'GetSystemMetrics'
    90.         import gdi32,\
    91.                 CreateCompatibleDC,'CreateCompatibleDC',\
    92.                 DeleteDC,'DeleteDC',\
    93.                 CreateCompatibleBitmap,'CreateCompatibleBitmap',\
    94.                 DeleteObject,'DeleteObject',\
    95.                 SelectObject,'SelectObject',\
    96.                 BitBlt,'BitBlt'
    97.         import gdiplus,\
    98.                 GdipCreateBitmapFromHBITMAP,'GdipCreateBitmapFromHBITMAP',\
    99.                 GdipDisposeImage,'GdipDisposeImage',\
    100.                 GdiplusStartup,'GdiplusStartup',\
    101.                 GdiplusShutdown,'GdiplusShutdown',\
    102.                 GdipSaveImageToFile,'GdipSaveImageToFile',\
    103.                 GdipGetImageEncodersSize,'GdipGetImageEncodersSize',\
    104.                 GdipGetImageEncoders,'GdipGetImageEncoders'
    105.  
    106. end data
    107.  
    108. align 4
    109.  
    110. DesktopDC              dd ?
    111. hDeskBMP               dd ?
    112. dcDeskBMP              dd ?
    113. encNum                 dd ?
    114. encSize                dd ?
    115. tSI                    GdiplusStartupInput <>
    116. tGDIP                  dd ?
    117. bytesWritten           dd ?
    118. frDesktopBitmap        dd ?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Насчет настройки параметров энкодера... там тоже проблем особых нету. В выложенных мной примерах я, кстати, оставил описания необходимых структур хотя и не использовал их. Нужен просто массив структур EncoderParameter в рамках структуры EncoderParameters. Для каждого параметра энкодера есть описаный в хэдерах GUID. Собственно достаточно подробно можно найти по той ссылке, которую я давал в 31-м посте.
    P.S.
    Имелось в виду "простейший" для реализации с ручным формированием содержимого конечного файла. :) Для реализации через GDI+ все случаи равны.
     
  5. hakeem

    hakeem New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    74
    Да, для меня это пока темный лес....
     
  6. hakeem

    hakeem New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    74
    l_inc

    Извините а как еще можно?
    А без api-функций это можно сделать?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    hakeem
    Дык в #41, #43 он и проводит код без использования ClipBorda :)
    Пора тебе всё таки засесть за доки и почитать что делают api из того кода ;)
     
  8. hakeem

    hakeem New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    74
    А точно, извините...