Сжимать скрины для передачи по сети

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 29 окт 2008.

  1. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    calidus
    без руля. Случайно в архиве наткнулся. Не подписан, но похоже, что с васма взят.
    А декомпрессор - стандартный жпеговский.
     
  2. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    Flasher понятно, что не одинаковые. Но если на них будут одинаковые фрагменты, то потом будет хорошо сжиматься. Можно попробовать его поверх другого формата (если окажется недостаточно)
     
  3. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    KondraT
    у тебя имплементация лзв какая ? на асме ? У меня на Си есть , но я переводил на асм, код стал оптимальнее , заметно. Но перевел не все , времени мало было. Но си мне не подходит , а либу делать так она толстая такая.


    _basmp_
    ну ясно =) я компресию хотел в других целях использовать, поэтому декомпресор на асме еще искал.
     
  4. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
  5. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    KondraT
    Спасибо !!! ))))))) Что то даже показалось что си код одинаковый с которого переводили )..
     
  6. provocateur

    provocateur Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    118
    _basmp_, а такой же маленький jpg-декодер есть?
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Код (Text):
    1. WIDTHH equ 800
    2. HEIGHT equ 600
    3.  
    4. .data
    5. sbuffer dd 0
    6. slen dd 0
    7.  
    8. .code
    9. CapScreen Proc uses edi esi ebx BitCo:dword
    10.      local hdc:HDC
    11.      local memdc:HDC
    12.      local hBitmap:dword
    13.      local dwWidth:dword
    14.      local dwHeight:dword
    15.  
    16.        invoke GetDC,0
    17.        mov hdc,eax
    18.        invoke CreateCompatibleDC,hdc
    19.        mov memdc,eax
    20.        invoke GetDeviceCaps,hdc,HORZRES
    21.        mov dwWidth,eax
    22.        invoke GetDeviceCaps,hdc,VERTRES
    23.        mov dwHeight,eax
    24.        invoke CreateCompatibleBitmap,hdc,WIDTHH,HEIGHT
    25.        mov hBitmap,eax
    26.        invoke SelectObject,memdc,hBitmap
    27.        ;invoke GdiFlush
    28.        ;invoke SetStretchBltMode,hdc,COLORONCOLOR
    29.        invoke StretchBlt,memdc,0,0,WIDTHH,HEIGHT,hdc,0,0,dwWidth,dwHeight,SRCCOPY
    30.        invoke ReleaseDC,0,hdc
    31.        
    32.        mov edi,sbuffer
    33.        mov (BITMAPFILEHEADER ptr [edi]).bfType,4D42h
    34.        add edi,sizeof BITMAPFILEHEADER
    35.        mov (BITMAPINFOHEADER ptr [edi]).biSize,sizeof BITMAPINFOHEADER
    36.        mov (BITMAPINFOHEADER ptr [edi]).biWidth,WIDTHH
    37.        mov (BITMAPINFOHEADER ptr [edi]).biHeight,HEIGHT
    38.        mov (BITMAPINFOHEADER ptr [edi]).biPlanes,1
    39.        mov eax,BitCo
    40.        mov (BITMAPINFOHEADER ptr [edi]).biBitCount,ax
    41.        mov (BITMAPINFOHEADER ptr [edi]).biCompression,BI_RGB
    42.        
    43.        invoke GetDIBits,memdc,hBitmap,0,HEIGHT,0,edi,0
    44.        mov ebx,edi
    45.        mov eax,BitCo
    46.         .if eax == 1
    47.            mov eax,2
    48.         .elseif eax == 4
    49.            mov eax,10h
    50.         .elseif eax == 8
    51.            mov eax,100h
    52.         .else
    53.            xor eax,eax
    54.         .endif
    55.        shl eax,2
    56.        mov edx,eax
    57.        mov ecx,(BITMAPINFOHEADER ptr [edi]).biSizeImage
    58.        add eax,(BITMAPINFOHEADER ptr [edi]).biSize
    59.        add ecx,eax
    60.        add edi,edx
    61.        add edi,sizeof BITMAPINFOHEADER
    62.        mov slen,ecx
    63.  
    64.        add ecx,sizeof BITMAPFILEHEADER
    65.        mov edx,sbuffer
    66.        mov (BITMAPFILEHEADER ptr [edx]).bfSize,ecx
    67.        mov eax,edi
    68.        sub eax,edx
    69.        sub eax,14
    70.        mov (BITMAPFILEHEADER ptr [edx]).bfOffBits,eax
    71.        invoke GetDIBits,memdc,hBitmap,0,HEIGHT,edi,ebx,0
    72.        invoke DeleteObject,hBitmap
    73.        invoke DeleteDC,memdc
    74.        ret
    75. CapScreen endp
    76.  
    77. szFileName db "screen.bmp",0
    78.  
    79. start proc
    80.        invoke DeleteFileA,offset szFileName
    81.        mov slen,100000h
    82.        invoke GlobalAlloc,40h,slen
    83.        mov sbuffer,eax
    84.        invoke CapScreen,8
    85.        invoke _lcreat,offset szFileName,0
    86.        mov esi,eax
    87.        invoke _lwrite,esi,sbuffer,slen
    88.        invoke _lclose,esi
    89.        invoke GlobalFree,sbuffer
    90.        invoke ExitProcess,0
    91. start endp
    92. end start
    Удолось добиться 469кб веса картинки.
    В принцапи устраивает, если и сжать потом чем-нить будет отлично.
    Задача теперь не много иная..
    Как взять любой bmp файл, и сделать с ним те же действия для порчи изображения что и со скрином раб стола?
    Я просто не понимаю как обходиться без GetDC и CreateCompatibleBitmap, но юзать StretchBlt.
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Flasher
    Почитать MSDN на тему работы с изображениями?
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    censored ну почитай :)))
    Первый рас у меня разрешение спрошивают по этому поводу :)
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    Код (Text):
    1. CapScreen1 Proc uses edi esi ebx BitCo:dword, pszFilespec : LPTSTR
    2. ...
    3.      local dwHeight:dword
    4.  
    5.     local   memdc1 : HDC                ;; ++
    6.     local   hbm1   : HBITMAP            ;; ++
    7.     local   hbm2   : HBITMAP            ;; ++
    8.     local   bm     : BITMAP             ;; ++
    9.  
    10.        invoke GetDC,0
    11.        mov hdc,eax
    12.  
    13.     invoke  CreateCompatibleDC, hdc         ;; ++
    14.     mov memdc1, eax             ;; ++
    15.     invoke  LoadImage, NULL, pszFilespec,\      ;; ++
    16.          IMAGE_BITMAP, 0, 0,\           ;; ++
    17.          LR_CREATEDIBSECTION or LR_LOADFROMFILE ;; ++
    18.     mov hbm1, eax               ;; ++
    19.     invoke  GetObject, hbm1, sizeof bm, addr bm ;; ++ получить размер картинки
    20.     invoke  SelectObject, memdc1, hbm1      ;; ++
    21.     mov hbm2, eax               ;; ++
    22.  
    23.        invoke CreateCompatibleDC,hdc
    24. ...
    25. ;;--       invoke StretchBlt,memdc,0,0,WIDTHH,HEIGHT,hdc,0,0,dwWidth,dwHeight,SRCCOPY
    26.     invoke  StretchBlt,memdc,0, 0, WIDTHH, HEIGHT,\ ;; ++
    27.          memdc1, 0,0, bm.bmWidth, bm.bmHeight,\ ;; ++ обрати внимание, источник тут memdc1
    28.          SRCCOPY                ;; ++
    29.        invoke ReleaseDC,0,hdc
    30.  
    31.     invoke  SelectObject, memdc1, hbm2      ;; ++ чистить за
    32.     invoke  DeleteDC, memdc1            ;; ++  за собой
    33.     invoke  DeleteObject, hbm1          ;; ++   не забываем
    34. ...
    35.        ret
    36. CapScreen1 endp
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    Попробуй, возможно, флаг LR_CREATEDIBSECTION лишний.
     
  12. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    q_q, качество исходной картинки портится, но разрешение как бы не уменьщается, а вырезается..
    Код (Text):
    1. WIDTHH equ 800
    2. HEIGHT equ 600
    3.  
    4. .data
    5. szOldFileName db "screen1.bmp",0
    6. szFileName db "screen2.bmp",0
    7.  
    8. sbuffer dd 0
    9. slen dd 0
    10.  
    11. .code
    12. CapScreen Proc uses edi esi ebx BitCo:dword
    13.      local hdc:HDC
    14.      local memdc1:HDC
    15.      local memdc2:HDC
    16.      local bm:BITMAP
    17.      local hBitmap1:dword
    18.      local hBitmap2:dword
    19.  
    20.        invoke GetDC,0
    21.        mov hdc,eax
    22.        invoke CreateCompatibleDC,hdc
    23.        mov memdc1,eax
    24.        invoke LoadImage,0,offset szOldFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE
    25.        mov hBitmap1,eax
    26.        invoke GetObject,hBitmap1,sizeof bm,addr bm
    27.        invoke SelectObject,memdc1,hBitmap1
    28.        mov hBitmap2,eax
    29.        invoke CreateCompatibleDC,hdc
    30.        mov memdc2,eax
    31.        invoke StretchBlt,memdc2,0,0,WIDTHH,HEIGHT,memdc1,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY
    32.        invoke ReleaseDC,0,hdc
    33.        
    34.        mov edi,sbuffer
    35.        mov (BITMAPFILEHEADER ptr [edi]).bfType,4D42h
    36.        add edi,sizeof BITMAPFILEHEADER
    37.        mov (BITMAPINFOHEADER ptr [edi]).biSize,sizeof BITMAPINFOHEADER
    38.        mov (BITMAPINFOHEADER ptr [edi]).biWidth,WIDTHH
    39.        mov (BITMAPINFOHEADER ptr [edi]).biHeight,HEIGHT
    40.        mov (BITMAPINFOHEADER ptr [edi]).biPlanes,1
    41.        mov eax,BitCo
    42.        mov (BITMAPINFOHEADER ptr [edi]).biBitCount,ax
    43.        mov (BITMAPINFOHEADER ptr [edi]).biCompression,BI_RGB
    44.        
    45.        invoke GetDIBits,memdc1,hBitmap1,0,HEIGHT,0,edi,0
    46.        mov ebx,edi
    47.        mov eax,BitCo
    48.         .if eax == 1
    49.            mov eax,2
    50.         .elseif eax == 4
    51.            mov eax,10h
    52.         .elseif eax == 8
    53.            mov eax,100h
    54.         .else
    55.            xor eax,eax
    56.         .endif
    57.        shl eax,2
    58.        mov edx,eax
    59.        mov ecx,(BITMAPINFOHEADER ptr [edi]).biSizeImage
    60.        add eax,(BITMAPINFOHEADER ptr [edi]).biSize
    61.        add ecx,eax
    62.        add edi,edx
    63.        add edi,sizeof BITMAPINFOHEADER
    64.        mov slen,ecx
    65.  
    66.        add ecx,sizeof BITMAPFILEHEADER
    67.        mov edx,sbuffer
    68.        mov (BITMAPFILEHEADER ptr [edx]).bfSize,ecx
    69.        mov eax,edi
    70.        sub eax,edx
    71.        sub eax,14
    72.        mov (BITMAPFILEHEADER ptr [edx]).bfOffBits,eax
    73.        invoke GetDIBits,memdc1,hBitmap1,0,HEIGHT,edi,ebx,0
    74.        
    75.        invoke SelectObject,memdc1,hBitmap2
    76.        invoke DeleteObject,hBitmap1
    77.        invoke DeleteDC,memdc1
    78.        ret
    79. CapScreen endp
    80. start proc
    81.        invoke DeleteFileA,offset szFileName
    82.        mov slen,100000h
    83.        invoke GlobalAlloc,40h,slen
    84.        mov sbuffer,eax
    85.        invoke CapScreen,8
    86.        invoke _lcreat,offset szFileName,0
    87.        mov esi,eax
    88.        invoke _lwrite,esi,sbuffer,slen
    89.        invoke _lclose,esi
    90.        invoke GlobalFree,sbuffer
    91.        invoke ExitProcess,0
    92. start endp
    93. end start
     
  13. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Flasher
    Всё просто. Если ты размер изображения делашь меньше чем оригинальный, то теряется качество.
    Получаешь битмапу как массив бит посредством GetDIBits() и сжимай его с помощью zip-апи.
     
  14. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    CrystalIC
    не шути так:)) сжатие бмп алгосами без потери качества - пустой номер.
    Flasher
    у ребят, разработавших джепег, сайт есть - вот и ломись туда. другой вопрос - для чего эт тебе нужно: для коммерческого пользования лиц. придёться брать.
     
  15. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    UbIvItS
    Это смотря как подходить к понятью битмапы. С моя точки зрения - просто байтовый массив в смысле сжатия не несёт смысловой нагрузки.
     
  16. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Спасибо за конвертор BMP->JPG, а сорцов обратного преобразования ни у кого нет? стрёмно тоскать в ресурсах BMPшные файлы. Думаю лучше будет поместить в ресурсы JPG, а при запуске проги декодировать в обычный BITMAP.
     
  17. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    bmp -> jpg = GdipLoadImageFromFile -> GdipSaveImageToFile
     
  18. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    CrystalIC
    смысл определяется содержимым этого массива, а содержимое определяет энтропию. алгосы без потери данных, ну, никак не тянут на сжатие медийной инфы, если не считать картинок с малым колвом оттенков и то опять же медийные АСы выигрывают.
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Flasher
    > разрешение как бы не уменьщается, а вырезается
    Это обычное поведение Stretch-функций, если перед ней вызвать invoke SetStretchBltMode, hdcDest, HALFTONE, то качество результирующей картинки заметно улучшится, правда, HALFTONE не доступна на 9x и Me.

    > качество исходной картинки портится
    Код #32 вообще работает? После StretchBlt результирующая картинка в memdc2 (для которой ты даже не завел совместимый битмап), а ты сохраняешь из memdc1. Надо примерно так
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. .nolist
    6. include windows.inc
    7. include kernel32.inc
    8. include gdi32.inc
    9. include user32.inc
    10. includelib kernel32.lib
    11. includelib gdi32.lib
    12. includelib user32.lib
    13. .list
    14.  
    15. WIDTHH equ 800      ;; почему две H(аш)?
    16. HEIGHT equ 600
    17.  
    18. .data
    19. szOldFileName   db  "screen1.bmp",0
    20. even
    21. szFileName  db  "screen2.bmp",0
    22. even
    23. sbuffer     dd  0
    24. slen        dd  0
    25.  
    26. .code
    27. even
    28. foo proc    uses ebx edi esi BitCo : DWORD
    29.  
    30.     local   hdcDst    : HDC
    31.     local   hbmDst    : HBITMAP
    32.     local   hbmDstOld : HBITMAP
    33.  
    34.     local   hdcSrc    : HDC
    35.     local   hbmSrc    : HBITMAP
    36.     local   hbmSrcOld : HBITMAP
    37.  
    38.     local   bmp       : BITMAP
    39.     local   hdc       : HDC
    40.  
    41.     invoke  GetDC, NULL
    42.     mov hdc, eax
    43.  
    44.     invoke  CreateCompatibleDC, hdc
    45.     mov hdcDst,eax
    46.     invoke  CreateCompatibleBitmap, hdc, WIDTHH, HEIGHT
    47.     mov hbmDst,eax
    48.     invoke  SelectObject, hdcDst, hbmDst
    49.     mov hbmDstOld,eax
    50.  
    51.     invoke  CreateCompatibleDC, hdc
    52.     mov hdcSrc,eax
    53.     invoke  LoadImage, NULL, offset szOldFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE
    54.     mov hbmSrc,eax
    55.     invoke  GetObject, hbmSrc, sizeof bmp, addr bmp
    56.     invoke  SelectObject, hdcSrc, hbmSrc
    57.     mov hbmSrcOld,eax
    58.  
    59.     invoke  ReleaseDC, NULL, hdc
    60. ;;
    61. ;; HALFTONE is not supported on Windows 95/98/Me.
    62. ;;
    63.     invoke  GetVersion
    64.     or  eax,eax
    65.     js  short @F
    66.     invoke  SetStretchBltMode, hdcDst, HALFTONE
    67. @@:
    68.     invoke  StretchBlt, hdcDst, 0, 0, WIDTHH,      HEIGHT,\
    69.                 hdcSrc, 0, 0, bmp.bmWidth, bmp.bmHeight,\
    70.                 SRCCOPY
    71.  
    72.     invoke  SelectObject, hdcDst, hbmDstOld
    73.  
    74.     invoke  SelectObject, hdcSrc, hbmSrcOld
    75.     invoke  DeleteDC, hdcSrc
    76.     invoke  DeleteObject, hbmSrc
    77.  
    78.     mov edi,sbuffer
    79.     mov (BITMAPFILEHEADER ptr [edi]).bfType,4D42h
    80.     add edi,sizeof BITMAPFILEHEADER
    81.     mov (BITMAPINFOHEADER ptr [edi]).biSize,sizeof BITMAPINFOHEADER
    82.     mov (BITMAPINFOHEADER ptr [edi]).biWidth,WIDTHH
    83.     mov (BITMAPINFOHEADER ptr [edi]).biHeight,HEIGHT
    84.     mov (BITMAPINFOHEADER ptr [edi]).biPlanes,1
    85.     mov eax,BitCo
    86.     mov (BITMAPINFOHEADER ptr [edi]).biBitCount,ax
    87.     mov (BITMAPINFOHEADER ptr [edi]).biCompression,BI_RGB
    88.        
    89.     invoke  GetDIBits, hdcDst, hbmDst, 0, HEIGHT, 0, edi, 0
    90.     mov ebx,edi
    91.     mov eax,BitCo
    92.     .if eax == 1
    93.         mov eax,2
    94.     .elseif eax == 4
    95.         mov eax,10h
    96.     .elseif eax == 8
    97.         mov eax,100h
    98.     .else
    99.         xor eax,eax
    100.     .endif
    101.     shl eax,2
    102.     mov edx,eax
    103.     mov ecx,(BITMAPINFOHEADER ptr [edi]).biSizeImage
    104.     add eax,(BITMAPINFOHEADER ptr [edi]).biSize
    105.     add ecx,eax
    106.     add edi,edx
    107.     add edi,sizeof BITMAPINFOHEADER
    108.     mov slen,ecx
    109.     add ecx,sizeof BITMAPFILEHEADER
    110.     mov edx,sbuffer
    111.     mov (BITMAPFILEHEADER ptr [edx]).bfSize,ecx
    112.     mov eax,edi
    113.     sub eax,edx
    114.     sub eax,14
    115.     mov (BITMAPFILEHEADER ptr [edx]).bfOffBits,eax
    116.     invoke  GetDIBits, hdcDst, hbmDst, 0, HEIGHT, edi, ebx, 0
    117.  
    118.     invoke  DeleteDC, hdcDst
    119.     invoke  DeleteObject, hbmDst
    120.  
    121.     ret
    122. foo endp
    123.  
    124. even
    125. start proc
    126.        invoke DeleteFileA,offset szFileName
    127.        mov slen,100000h
    128.        invoke GlobalAlloc,40h,slen
    129.        mov sbuffer,eax
    130.        invoke foo,8
    131.        invoke _lcreat,offset szFileName,0
    132.        mov esi,eax
    133.        invoke _lwrite,esi,sbuffer,slen
    134.        invoke _lclose,esi
    135.        invoke GlobalFree,sbuffer
    136.        invoke ExitProcess,0
    137. start endp
    138. end start
    ps imho без HALFTONE + 1280x1024 -> 800x600 качество никакое.
     
  20. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    q_q
    C одной "h" пишет error A2008: syntax error : width
    А even это аналог align'a ?
    А по поводу качества, главное чтоб там кой что было видно.., не голых дэвушек будут рассмотривать.. :)
    Спасибо тебе огромное ;)