Всем привет. В одной из картинок зашифровано сообщение, другая является ключом (эталоном). Алгоритм шифрования прост: в красный канал каждого пикселя ключевой картинки добавлена уменьшенная в 100 раз интенсивность этого же пикселя из картинки с сообщением (она черно-белая). Размер картинок, естественно, одинаков. Формат - bmp. Как с помощью асма вытащить красный канал?
GetRValue MACRO color PUSH ebx mov ebx, color xor eax, eax mov al, bl POP ebx ENDM ;;;;;; LOCAL pt:POINT, clr :COLORREF invoke GetPixel,hdc,pt.x,pt.y mov clr, eax GetRValue clr
Код (Text): f rd 1 width rd 1 height rd 1 bitmap rd 1 size1 rd 1 size2 rd 1 buffer rd 1 target rd 1 raster rd 1 filename db 'C:\bitmap.bmp',0 --//-- invoke CreateFile,filename,GENERIC_READ,0,0,OPEN_EXISTING,0,0 mov [f],eax invoke SetFilePointer,eax,10,0,FILE_BEGIN invoke ReadFile,[f],raster,4,buffer,0 invoke SetFilePointer,[f],18,0,FILE_BEGIN invoke ReadFile,[f],width,8,buffer,0 mov eax,[width] mul [height] mov [size2],eax lea eax,[eax*2+eax] mov [size1],eax invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE mov [bitmap],eax invoke SetFilePointer,[f],[raster],0,FILE_BEGIN invoke ReadFile,[f],[bitmap],[size1],buffer,0 invoke CloseHandle,[f] invoke VirtualAlloc,0,[size2],MEM_COMMIT,PAGE_READWRITE mov [target],eax mov esi,[bitmap] mov edi,eax mov edx,[size] add edx,esi @@:movsb add esi,2 cmp esi,edx jne @b invoke VirtualFree,[target],[size2],MEM_DECOMMIT invoke VirtualFree,[bitmap],[size1],MEM_DECOMMIT
Решил поднять тему, дабы возникли вопросы... 1. Как правильно выравнивать данные в битмапе с глубиной 24 бита? 2. Почему писанная мною прога выводит тока 42 кб, вместо 125 ? Исходник в атаче...