Blog. Just Blog

Вывод изображения на Ассемблере с помощью WIC

13.08.2022 | Категория: Образ мышления: Assembler | Автор: ManHunter
На сайте уже есть две статьи про загрузку и вывод изображения с помощью GDI+ и OLE, сегодня расскажу про еще очередной способ загрузки изображений, на этот раз с помощью WIC (Windows Imaging Component). Эта технология позволяет не привязываться к конкретным форматам изображений, а делегировать большую часть рутинной работы системе. Если установлен соответствующий графический кодек и система в принципе может открыть изображение во встроенном Просмотрщике фотографий, значит его можно будет прочитать и при помощи Windows Imaging Component. Например, популярный формат WebP в чистой Windows 7 не открывается, но если поставить кодеки, то все сразу заработает.

Переходим к программированию. Поскольку это COM-технология, то нам понадобится описание множества GUID, констант и интерфейсов. Надо ли говорить, что FASM про них ничего не знает? А множество действительно внушительное.
  1. ; GUID {CACAF262-9370-4615-A13B-9F5539DA4C0A}
  2. CLSID_WICImagingFactory dd 0CACAF262h
  3.                         dw 09370h
  4.                         dw 04615h
  5.                         db 0A1h, 03Bh, 09Fh, 055h, 039h, 0DAh, 04Ch, 00Ah
  6.  
  7. ; GUID {EC5EC8A9-C395-4314-9C77-54D7A935FF70}
  8. IID_IWICImagingFactory dd 0EC5EC8A9h
  9.                        dw 0C395h
  10.                        dw 04314h
  11.                        db 09Ch, 077h, 054h, 0D7h, 0A9h, 035h, 0FFh, 070h
  12.  
  13. ; IID_IWICImagingFactory Interface
  14. struct IWICImagingFactory
  15.     ; IUnknown
  16.     QueryInterface                           dd ?   ; 000h
  17.     AddRef                                   dd ?   ; 004h
  18.     Release                                  dd ?   ; 008h
  19.     ; IWICImagingFactory
  20.     CreateDecoderFromFilename                dd ?   ; 00Ch
  21.     CreateDecoderFromStream                  dd ?   ; 010h
  22.     CreateDecoderFromFileHandle              dd ?   ; 014h
  23.     CreateComponentInfo                      dd ?   ; 018h
  24.     CreateDecoder                            dd ?   ; 01Ch
  25.     CreateEncoder                            dd ?   ; 020h
  26.     CreatePalette                            dd ?   ; 024h
  27.     CreateFormatConverter                    dd ?   ; 028h
  28.     CreateBitmapScaler                       dd ?   ; 02Ch
  29.     CreateBitmapClipper                      dd ?   ; 030h
  30.     CreateBitmapFlipRotator                  dd ?   ; 034h
  31.     CreateStream                             dd ?   ; 038h
  32.     CreateColorContext                       dd ?   ; 03Ch
  33.     CreateColorTransformer                   dd ?   ; 040h
  34.     CreateBitmap                             dd ?   ; 044h
  35.     CreateBitmapFromSource                   dd ?   ; 048h
  36.     CreateBitmapFromSourceRect               dd ?   ; 04Ch
  37.     CreateBitmapFromMemory                   dd ?   ; 050h
  38.     CreateBitmapFromHBITMAP                  dd ?   ; 054h
  39.     CreateBitmapFromHICON                    dd ?   ; 058h
  40.     CreateComponentEnumerator                dd ?   ; 05Ch
  41.     CreateFastMetadataEncoderFromDecoder     dd ?   ; 060h
  42.     CreateFastMetadataEncoderFromFrameDecode dd ?   ; 064h
  43.     CreateQueryWriter                        dd ?   ; 068h
  44.     CreateQueryWriterFromReader              dd ?   ; 06Ch
  45. ends
  46.  
  47. ; IID_IWICBitmapDecoder Interface
  48. struct IWICBitmapDecoder
  49.     ; IUnknown
  50.     QueryInterface         dd ?   ; 000h
  51.     AddRef                 dd ?   ; 004h
  52.     Release                dd ?   ; 008h
  53.     ; IWICBitmapDecoder
  54.     QueryCapability        dd ?   ; 00Ch
  55.     Initialize             dd ?   ; 010h
  56.     GetContainerFormat     dd ?   ; 014h
  57.     GetDecoderInfo         dd ?   ; 018h
  58.     CopyPalette            dd ?   ; 01Ch
  59.     GetMetadataQueryReader dd ?   ; 020h
  60.     GetPreview             dd ?   ; 024h
  61.     GetColorContexts       dd ?   ; 028h
  62.     GetThumbnail           dd ?   ; 02Ch
  63.     GetFrameCount          dd ?   ; 030h
  64.     GetFrame               dd ?   ; 034h
  65. ends
  66.  
  67. ; IWICBitmapFrameDecode Interface
  68. struct IWICBitmapFrameDecode
  69.     ; IUnknown
  70.     QueryInterface         dd ?   ; 000h
  71.     AddRef                 dd ?   ; 004h
  72.     Release                dd ?   ; 008h
  73.     ; IWICBitmapFrameDecode
  74.     GetSize                dd ?   ; 00Ch
  75.     GetPixelFormat         dd ?   ; 010h
  76.     GetResolution          dd ?   ; 014h
  77.     CopyPalette            dd ?   ; 018h
  78.     CopyPixels             dd ?   ; 01Ch
  79.     GetMetadataQueryReader dd ?   ; 020h
  80.     GetColorContexts       dd ?   ; 024h
  81.     GetThumbnail           dd ?   ; 028h
  82. ends
  83.  
  84. ; IID_IWICFormatConverter Interface
  85. struct IWICFormatConverter
  86.     ; IUnknown
  87.     QueryInterface dd ?   ; 000h
  88.     AddRef         dd ?   ; 004h
  89.     Release        dd ?   ; 008h
  90.     ; IWICFormatConverter
  91.     GetSize        dd ?   ; 00Ch
  92.     GetPixelFormat dd ?   ; 010h
  93.     GetResolution  dd ?   ; 014h
  94.     CopyPalette    dd ?   ; 018h
  95.     CopyPixels     dd ?   ; 01Ch
  96.     Initialize     dd ?   ; 020h
  97.     CanConvert     dd ?   ; 024h
  98. ends
  99.  
  100. ; IID_IWICBitmap Interface
  101. struct IWICBitmap
  102.     ; IUnknown
  103.     QueryInterface dd ?   ; 000h
  104.     AddRef         dd ?   ; 004h
  105.     Release        dd ?   ; 008h
  106.     ; IWICBitmap
  107.     GetSize        dd ?   ; 00Ch
  108.     GetPixelFormat dd ?   ; 010h
  109.     GetResolution  dd ?   ; 014h
  110.     CopyPalette    dd ?   ; 018h
  111.     CopyPixels     dd ?   ; 01Ch
  112.     Lock           dd ?   ; 020h
  113.     SetPalette     dd ?   ; 024h
  114.     SetResolution  dd ?   ; 028h
  115. ends
  116.  
  117. ; IID_IWICBitmapLock Interface
  118. struct IWICBitmapLock
  119.     ; IUnknown
  120.     QueryInterface dd ?   ; 000h
  121.     AddRef         dd ?   ; 004h
  122.     Release        dd ?   ; 008h
  123.     ; IWICBitmapLock
  124.     GetSize        dd ?   ; 00Ch
  125.     GetStride      dd ?   ; 010h
  126.     GetDataPointer dd ?   ; 014h
  127.     GetPixelFormat dd ?   ; 018h
  128. ends
  129.  
  130. ; GUID {6FDDC324-4E03-4BFE-B185-3D77768DC910}
  131. GUID_WICPixelFormat32bppPBGRA dd 06FDDC324h
  132.                               dw 04E03h
  133.                               dw 04BFEh
  134.                               db 0B1h, 085h, 03Dh, 077h, 076h, 08Dh, 0C9h, 010h
  135.  
  136. CLSCTX_INPROC_SERVER = 0x01
  137.  
  138. WICBitmapDitherTypeNone        = 0x00000000
  139. WICBitmapPaletteTypeCustom     = 0x00000000
  140. WICBitmapCacheOnDemand         = 0x00000001
  141. WICBitmapLockWrite             = 0x00000002
  142. WICDecodeMetadataCacheOnDemand = 0x00000000
Процесс загрузки изображения начинается с создания фабрики объектов типа IWICImagingFactory, с помощью которой мы в дальнейшем будем создавать декодеры, модификаторы и все прочие инструменты для работы. Тут ничего сложного, обычная работа с COM.

Читать статью целиком »
Просмотров: 759 | Комментариев: 5

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 1 (0.0183 сек.) / Память: 4.5 Mb
Наверх