calidus без руля. Случайно в архиве наткнулся. Не подписан, но похоже, что с васма взят. А декомпрессор - стандартный жпеговский.
Flasher понятно, что не одинаковые. Но если на них будут одинаковые фрагменты, то потом будет хорошо сжиматься. Можно попробовать его поверх другого формата (если окажется недостаточно)
KondraT у тебя имплементация лзв какая ? на асме ? У меня на Си есть , но я переводил на асм, код стал оптимальнее , заметно. Но перевел не все , времени мало было. Но си мне не подходит , а либу делать так она толстая такая. _basmp_ ну ясно =) я компресию хотел в других целях использовать, поэтому декомпресор на асме еще искал.
calidus, на асме. Правда, изначально написано было на Си. Брал вот отсюда - http://www.wasm.ru/forum/viewtopic.php?id=19435, пост Perre.
Код (Text): WIDTHH equ 800 HEIGHT equ 600 .data sbuffer dd 0 slen dd 0 .code CapScreen Proc uses edi esi ebx BitCo:dword local hdc:HDC local memdc:HDC local hBitmap:dword local dwWidth:dword local dwHeight:dword invoke GetDC,0 mov hdc,eax invoke CreateCompatibleDC,hdc mov memdc,eax invoke GetDeviceCaps,hdc,HORZRES mov dwWidth,eax invoke GetDeviceCaps,hdc,VERTRES mov dwHeight,eax invoke CreateCompatibleBitmap,hdc,WIDTHH,HEIGHT mov hBitmap,eax invoke SelectObject,memdc,hBitmap ;invoke GdiFlush ;invoke SetStretchBltMode,hdc,COLORONCOLOR invoke StretchBlt,memdc,0,0,WIDTHH,HEIGHT,hdc,0,0,dwWidth,dwHeight,SRCCOPY invoke ReleaseDC,0,hdc mov edi,sbuffer mov (BITMAPFILEHEADER ptr [edi]).bfType,4D42h add edi,sizeof BITMAPFILEHEADER mov (BITMAPINFOHEADER ptr [edi]).biSize,sizeof BITMAPINFOHEADER mov (BITMAPINFOHEADER ptr [edi]).biWidth,WIDTHH mov (BITMAPINFOHEADER ptr [edi]).biHeight,HEIGHT mov (BITMAPINFOHEADER ptr [edi]).biPlanes,1 mov eax,BitCo mov (BITMAPINFOHEADER ptr [edi]).biBitCount,ax mov (BITMAPINFOHEADER ptr [edi]).biCompression,BI_RGB invoke GetDIBits,memdc,hBitmap,0,HEIGHT,0,edi,0 mov ebx,edi mov eax,BitCo .if eax == 1 mov eax,2 .elseif eax == 4 mov eax,10h .elseif eax == 8 mov eax,100h .else xor eax,eax .endif shl eax,2 mov edx,eax mov ecx,(BITMAPINFOHEADER ptr [edi]).biSizeImage add eax,(BITMAPINFOHEADER ptr [edi]).biSize add ecx,eax add edi,edx add edi,sizeof BITMAPINFOHEADER mov slen,ecx add ecx,sizeof BITMAPFILEHEADER mov edx,sbuffer mov (BITMAPFILEHEADER ptr [edx]).bfSize,ecx mov eax,edi sub eax,edx sub eax,14 mov (BITMAPFILEHEADER ptr [edx]).bfOffBits,eax invoke GetDIBits,memdc,hBitmap,0,HEIGHT,edi,ebx,0 invoke DeleteObject,hBitmap invoke DeleteDC,memdc ret CapScreen endp szFileName db "screen.bmp",0 start proc invoke DeleteFileA,offset szFileName mov slen,100000h invoke GlobalAlloc,40h,slen mov sbuffer,eax invoke CapScreen,8 invoke _lcreat,offset szFileName,0 mov esi,eax invoke _lwrite,esi,sbuffer,slen invoke _lclose,esi invoke GlobalFree,sbuffer invoke ExitProcess,0 start endp end start Удолось добиться 469кб веса картинки. В принцапи устраивает, если и сжать потом чем-нить будет отлично. Задача теперь не много иная.. Как взять любой bmp файл, и сделать с ним те же действия для порчи изображения что и со скрином раб стола? Я просто не понимаю как обходиться без GetDC и CreateCompatibleBitmap, но юзать StretchBlt.
Flasher Код (Text): CapScreen1 Proc uses edi esi ebx BitCo:dword, pszFilespec : LPTSTR ... local dwHeight:dword local memdc1 : HDC ;; ++ local hbm1 : HBITMAP ;; ++ local hbm2 : HBITMAP ;; ++ local bm : BITMAP ;; ++ invoke GetDC,0 mov hdc,eax invoke CreateCompatibleDC, hdc ;; ++ mov memdc1, eax ;; ++ invoke LoadImage, NULL, pszFilespec,\ ;; ++ IMAGE_BITMAP, 0, 0,\ ;; ++ LR_CREATEDIBSECTION or LR_LOADFROMFILE ;; ++ mov hbm1, eax ;; ++ invoke GetObject, hbm1, sizeof bm, addr bm ;; ++ получить размер картинки invoke SelectObject, memdc1, hbm1 ;; ++ mov hbm2, eax ;; ++ invoke CreateCompatibleDC,hdc ... ;;-- invoke StretchBlt,memdc,0,0,WIDTHH,HEIGHT,hdc,0,0,dwWidth,dwHeight,SRCCOPY invoke StretchBlt,memdc,0, 0, WIDTHH, HEIGHT,\ ;; ++ memdc1, 0,0, bm.bmWidth, bm.bmHeight,\ ;; ++ обрати внимание, источник тут memdc1 SRCCOPY ;; ++ invoke ReleaseDC,0,hdc invoke SelectObject, memdc1, hbm2 ;; ++ чистить за invoke DeleteDC, memdc1 ;; ++ за собой invoke DeleteObject, hbm1 ;; ++ не забываем ... ret CapScreen1 endp
q_q, качество исходной картинки портится, но разрешение как бы не уменьщается, а вырезается.. Код (Text): WIDTHH equ 800 HEIGHT equ 600 .data szOldFileName db "screen1.bmp",0 szFileName db "screen2.bmp",0 sbuffer dd 0 slen dd 0 .code CapScreen Proc uses edi esi ebx BitCo:dword local hdc:HDC local memdc1:HDC local memdc2:HDC local bm:BITMAP local hBitmap1:dword local hBitmap2:dword invoke GetDC,0 mov hdc,eax invoke CreateCompatibleDC,hdc mov memdc1,eax invoke LoadImage,0,offset szOldFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE mov hBitmap1,eax invoke GetObject,hBitmap1,sizeof bm,addr bm invoke SelectObject,memdc1,hBitmap1 mov hBitmap2,eax invoke CreateCompatibleDC,hdc mov memdc2,eax invoke StretchBlt,memdc2,0,0,WIDTHH,HEIGHT,memdc1,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY invoke ReleaseDC,0,hdc mov edi,sbuffer mov (BITMAPFILEHEADER ptr [edi]).bfType,4D42h add edi,sizeof BITMAPFILEHEADER mov (BITMAPINFOHEADER ptr [edi]).biSize,sizeof BITMAPINFOHEADER mov (BITMAPINFOHEADER ptr [edi]).biWidth,WIDTHH mov (BITMAPINFOHEADER ptr [edi]).biHeight,HEIGHT mov (BITMAPINFOHEADER ptr [edi]).biPlanes,1 mov eax,BitCo mov (BITMAPINFOHEADER ptr [edi]).biBitCount,ax mov (BITMAPINFOHEADER ptr [edi]).biCompression,BI_RGB invoke GetDIBits,memdc1,hBitmap1,0,HEIGHT,0,edi,0 mov ebx,edi mov eax,BitCo .if eax == 1 mov eax,2 .elseif eax == 4 mov eax,10h .elseif eax == 8 mov eax,100h .else xor eax,eax .endif shl eax,2 mov edx,eax mov ecx,(BITMAPINFOHEADER ptr [edi]).biSizeImage add eax,(BITMAPINFOHEADER ptr [edi]).biSize add ecx,eax add edi,edx add edi,sizeof BITMAPINFOHEADER mov slen,ecx add ecx,sizeof BITMAPFILEHEADER mov edx,sbuffer mov (BITMAPFILEHEADER ptr [edx]).bfSize,ecx mov eax,edi sub eax,edx sub eax,14 mov (BITMAPFILEHEADER ptr [edx]).bfOffBits,eax invoke GetDIBits,memdc1,hBitmap1,0,HEIGHT,edi,ebx,0 invoke SelectObject,memdc1,hBitmap2 invoke DeleteObject,hBitmap1 invoke DeleteDC,memdc1 ret CapScreen endp start proc invoke DeleteFileA,offset szFileName mov slen,100000h invoke GlobalAlloc,40h,slen mov sbuffer,eax invoke CapScreen,8 invoke _lcreat,offset szFileName,0 mov esi,eax invoke _lwrite,esi,sbuffer,slen invoke _lclose,esi invoke GlobalFree,sbuffer invoke ExitProcess,0 start endp end start
Flasher Всё просто. Если ты размер изображения делашь меньше чем оригинальный, то теряется качество. Получаешь битмапу как массив бит посредством GetDIBits() и сжимай его с помощью zip-апи.
CrystalIC не шути так) сжатие бмп алгосами без потери качества - пустой номер. Flasher у ребят, разработавших джепег, сайт есть - вот и ломись туда. другой вопрос - для чего эт тебе нужно: для коммерческого пользования лиц. придёться брать.
UbIvItS Это смотря как подходить к понятью битмапы. С моя точки зрения - просто байтовый массив в смысле сжатия не несёт смысловой нагрузки.
Спасибо за конвертор BMP->JPG, а сорцов обратного преобразования ни у кого нет? стрёмно тоскать в ресурсах BMPшные файлы. Думаю лучше будет поместить в ресурсы JPG, а при запуске проги декодировать в обычный BITMAP.
CrystalIC смысл определяется содержимым этого массива, а содержимое определяет энтропию. алгосы без потери данных, ну, никак не тянут на сжатие медийной инфы, если не считать картинок с малым колвом оттенков и то опять же медийные АСы выигрывают.
Flasher > разрешение как бы не уменьщается, а вырезается Это обычное поведение Stretch-функций, если перед ней вызвать invoke SetStretchBltMode, hdcDest, HALFTONE, то качество результирующей картинки заметно улучшится, правда, HALFTONE не доступна на 9x и Me. > качество исходной картинки портится Код #32 вообще работает? После StretchBlt результирующая картинка в memdc2 (для которой ты даже не завел совместимый битмап), а ты сохраняешь из memdc1. Надо примерно так Код (Text): .386 .model flat, stdcall option casemap:none .nolist include windows.inc include kernel32.inc include gdi32.inc include user32.inc includelib kernel32.lib includelib gdi32.lib includelib user32.lib .list WIDTHH equ 800 ;; почему две H(аш)? HEIGHT equ 600 .data szOldFileName db "screen1.bmp",0 even szFileName db "screen2.bmp",0 even sbuffer dd 0 slen dd 0 .code even foo proc uses ebx edi esi BitCo : DWORD local hdcDst : HDC local hbmDst : HBITMAP local hbmDstOld : HBITMAP local hdcSrc : HDC local hbmSrc : HBITMAP local hbmSrcOld : HBITMAP local bmp : BITMAP local hdc : HDC invoke GetDC, NULL mov hdc, eax invoke CreateCompatibleDC, hdc mov hdcDst,eax invoke CreateCompatibleBitmap, hdc, WIDTHH, HEIGHT mov hbmDst,eax invoke SelectObject, hdcDst, hbmDst mov hbmDstOld,eax invoke CreateCompatibleDC, hdc mov hdcSrc,eax invoke LoadImage, NULL, offset szOldFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE mov hbmSrc,eax invoke GetObject, hbmSrc, sizeof bmp, addr bmp invoke SelectObject, hdcSrc, hbmSrc mov hbmSrcOld,eax invoke ReleaseDC, NULL, hdc ;; ;; HALFTONE is not supported on Windows 95/98/Me. ;; invoke GetVersion or eax,eax js short @F invoke SetStretchBltMode, hdcDst, HALFTONE @@: invoke StretchBlt, hdcDst, 0, 0, WIDTHH, HEIGHT,\ hdcSrc, 0, 0, bmp.bmWidth, bmp.bmHeight,\ SRCCOPY invoke SelectObject, hdcDst, hbmDstOld invoke SelectObject, hdcSrc, hbmSrcOld invoke DeleteDC, hdcSrc invoke DeleteObject, hbmSrc mov edi,sbuffer mov (BITMAPFILEHEADER ptr [edi]).bfType,4D42h add edi,sizeof BITMAPFILEHEADER mov (BITMAPINFOHEADER ptr [edi]).biSize,sizeof BITMAPINFOHEADER mov (BITMAPINFOHEADER ptr [edi]).biWidth,WIDTHH mov (BITMAPINFOHEADER ptr [edi]).biHeight,HEIGHT mov (BITMAPINFOHEADER ptr [edi]).biPlanes,1 mov eax,BitCo mov (BITMAPINFOHEADER ptr [edi]).biBitCount,ax mov (BITMAPINFOHEADER ptr [edi]).biCompression,BI_RGB invoke GetDIBits, hdcDst, hbmDst, 0, HEIGHT, 0, edi, 0 mov ebx,edi mov eax,BitCo .if eax == 1 mov eax,2 .elseif eax == 4 mov eax,10h .elseif eax == 8 mov eax,100h .else xor eax,eax .endif shl eax,2 mov edx,eax mov ecx,(BITMAPINFOHEADER ptr [edi]).biSizeImage add eax,(BITMAPINFOHEADER ptr [edi]).biSize add ecx,eax add edi,edx add edi,sizeof BITMAPINFOHEADER mov slen,ecx add ecx,sizeof BITMAPFILEHEADER mov edx,sbuffer mov (BITMAPFILEHEADER ptr [edx]).bfSize,ecx mov eax,edi sub eax,edx sub eax,14 mov (BITMAPFILEHEADER ptr [edx]).bfOffBits,eax invoke GetDIBits, hdcDst, hbmDst, 0, HEIGHT, edi, ebx, 0 invoke DeleteDC, hdcDst invoke DeleteObject, hbmDst ret foo endp even start proc invoke DeleteFileA,offset szFileName mov slen,100000h invoke GlobalAlloc,40h,slen mov sbuffer,eax invoke foo,8 invoke _lcreat,offset szFileName,0 mov esi,eax invoke _lwrite,esi,sbuffer,slen invoke _lclose,esi invoke GlobalFree,sbuffer invoke ExitProcess,0 start endp end start ps imho без HALFTONE + 1280x1024 -> 800x600 качество никакое.
q_q C одной "h" пишет error A2008: syntax error : width А even это аналог align'a ? А по поводу качества, главное чтоб там кой что было видно.., не голых дэвушек будут рассмотривать.. Спасибо тебе огромное