Сравнение bitmap'ов

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

  1. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    Имеются два HBITMAP (именно HBITMAP). Нужно сравнить их bitmap'ы. Как это сделать наиболее эффективно?



    Вообще, мне нужно сравнить bitmap из ресурсов PE-файла, с моим .BMP
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Лучше через FindResource, типа такого :
    Код (Text):
    1. ;=====================================================================      
    2. ID_BMP      =       100           ; Идентификатор ресурса
    3. module      db      'resource.dll',0  ; Имя модуля
    4. mybmp       file    'image.bmp'       ; Ваш битмап в памяти
    5. size        =       $-mybmp       ; Размер битмапа
    6. ;=====================================================================      
    7. entry $
    8.         stdcall [GetModuleHandle],module
    9.             mov     esi,eax
    10.         stdcall [FindResource],eax,ID_BMP,RT_BITMAP
    11.         or      eax,eax
    12.         jz      exit
    13.         cmp     dword[eax+4],size-sizeof.BITMAPFILEHEADER
    14.         jnz     exit
    15.         add     esi,[eax]
    16.         mov     edi,mybmp+sizeof.BITMAPFILEHEADER
    17.         mov     ecx,((size-sizeof.BITMAPFILEHEADER) and -3)/4
    18.         cld
    19.         repe    cmpsd
    20.         jnz     exit
    21.         push    (size-sizeof.BITMAPFILEHEADER) and 3
    22.             pop     ecx
    23.         repe    cmpsb
    24.         jz      совпали
    25. exit:
    26. ;=====================================================================
     
  3. alterego

    alterego New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2005
    Сообщения:
    44
    Адрес:
    Russia
    Спасибо. Сам бы никогда не додумался. А где Вы это нашли? В msdn я ничего подобного не видел.

    Я так понял, что HRSRC, возвращаемое FindResource, нужно преобразовать в PIMAGE_RESOURCE_DATA_ENTRY.
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    В отладчике посмотри на ресурсы, битмап лежит в таком виде
    Код (Text):
    1. rva bitmap     dd   1000
    2. sizeof.bitmap  dd   1024
    3.            dd      0
    4.            dd      0
    5. data_bitmap    rb   sizeof.bitmap
    FindResource возвращает указатель на начало этой структуры, сразу сравниваем размер sizeof.bitmap с твоим, если не совпадает - дальше можно не сверять, иначе получаем указатель на data_bitmap (imagebase (GetModuleHandle) + rva bitmap) и сверяем без учета BITMAPFILEHEADER (в ресурсах RT_BITMAP его нет)