Author Topic: Как уменьшить размер (объём) скриншота в байтах  (Read 1569 times)

0 Members and 1 Guest are viewing this topic.

Alex-on-777

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Доброго времени суток! Искал на форуме, не нашёл (если что, извиняйте)).
Суть в следующем:
Делаю порядка 10 000 скриншотов через: SCREENSHOTEX(11,174,1167,736, "file",1) - формат jpeg - получается плохое рарешение (по190 КБ);
Если делаю через SCREENSHOTEX(11,174,1167,736, "file",0) - формат bmp - разрешение получается хорошее, но каждый скрин весит 3 МБ;
Возможно ли как-то получить скрин размером 400 - 600 КБ ?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
"Разрешение" такое же.

Смотря для каких тебе целей. Если не использовать потом этот скрин для кликера, сохраняй в jpeg
Качество можно выставить в data\config.ini  параметр sshot_jpeg_quality
Ставь 100. Но это всё равно будет сжатие с потерями.



Если нужны скрины без потерь, например выловить редкий шаблон для нарезки заготовки под поиск, то можно сторонними утилитами по расписанию переводить все bmp в папке в png или архивировать архиватором, с удалением bmp-шек.
Вот, например, через cmd

Прям в скрипте можно поставить раз в определённое время сжимать скрины в архив
Code: (clickermann) [Select]
$7zip = STRCONCAT(CHAR(34), "C:\Program Files\7-Zip\7z.exe", CHAR(34))
$curdatetime = "%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%"

EXECUTE("cmd.exe", STRCONCAT("/C cd screens && ", $7zip, " a -mx5 -sdel -y -mmt=4 archive_", $curdatetime, ".7z *.bmp"))

В папке со скринами будут появляться архивы вида "archive_2021-09-24_11-20-54.7z"


Можно и через планировщик задач запускать cmd
https://yadi.sk/d/woeNbfDtIS8qow


Минус архивации - сброс счётчика скринов, т.к. скрины мы удаляем. После архивации счётчик начинается сначала. Если это критично, можно скрины нумеровать самому.
Вот скрипт нумерующий скрины на каждый запуск скрипта. Новый запуск - новая нумерация и новый пополняющийся единый архив на весь запуск.
Code: (clickermann) [Select]
// подпрограмма делающая скриншоты со своей нумерацией
SUB(screen)
    DEFINE($screen_num, 1)
    SCREENSHOTFIX(11,174,1167,736, STRCONCAT("screens\file_", $screen_num, ".bmp"), 0)
    INC($screen_num)
END_SUB

// делаем 3 тестовых скрина
SUB(test_screen)
    FOR($i=0, $i < 3)
        screen()
        WAIT(1)
    END_CYC
END_SUB
//==============================================================================

// один раз создаём переменные
IF($repeatedly = 0)
    $repeatedly = 1
    $7zip = STRCONCAT(CHAR(34), "C:\Program Files\7-Zip\7z.exe", CHAR(34))
    $curdatetime = STRCONCAT($_date_y, ".", STRCUT($_date_str, 4, 2), ".", STRCUT($_date_str, 1, 2), "_", $_time_str)
    $curdatetime = STRREPLACE($curdatetime, ":", ".")
$curdatetime = STRREPLACE($curdatetime, ":", ".")
END_IF


test_screen()
// архивируем скрины не заархивированные на данный момент
EXECUTE("cmd.exe", STRCONCAT("/C cd screens &&", $7zip, " a -mx5 -sdel -y -mmt=4 archive_", $curdatetime, ".7z *.bmp"))


test_screen()
// архивируем скрины не заархивированные на данный момент
EXECUTE("cmd.exe", STRCONCAT("/C cd screens &&", $7zip, " a -mx5 -sdel -y -mmt=4 archive_", $curdatetime, ".7z *.bmp"))

HALT


Alex-on-777

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Спасибо за инфу (в том числе про архивацию) - пригодится.
Я потом через FINEREADER делаю распознование текста. Нет такого параметра как sshot_bmp_quality или sshot_png_quality ? (поставил 100 в sshot_jpeg_quality (было 90) - на распознование в FINEREADER не повлияло (распознаёт корректно только 80-90%). Через BMP или PNG распознование 100% (цифровой текст типа 1.23-56-85)


Ivankak

  • Освоившийся
  • **
  • Posts: 37
    • View Profile
Если jpg не подходит по качеству, то можно попробовать tiff с компрессией. У него встроенная zip и lzw без потерь.  можешь получить уменьшение до 2 раз.
Размер компрессии без потерь всегда сильно зависит от содержимого картинки. Судя по тому, что у тебя такая мелкая картинка имеет размер 3 мега, у тебя либо много мелких деталей (очень мелкий шрифт) либо шумы.
Попробуй ffmpeg для конвертации, можно прямо из кликермана запускать его и в командной строке ему все параметры передать.
 логика такая:
сохраняешь png
вызываешь внешнюю программу ffmpeg и конвертируешь ей файл в tiff
удаляешь png

тут про конвертацию
https://superuser.com/questions/827606/use-ffmpeg-for-jpeg-to-tiff-conversion

Если у тебя чб текст, что можно палитру в grayscale конвертировать и\или сохранять в png-8 (оптимизированная палитра 256 (или 128 или 64 цветов), это может дать уменьшение в 2 раза, а распознавание не ухудшиться.

Если из кликермана запускать ffmpeg не удобно, то сначала сохраняешь свои скриншоты, а потом все групповым образом конвертируешь.
можно фотошопом в пакетном режиме, можно Faststoun или ffmpeg испоьзовать, что сподручнее.

« Last Edit: September 26, 2021, 09:52:20 AM by Ivankak »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Я потом через FINEREADER делаю распознование текста. Нет такого параметра как sshot_bmp_quality или sshot_png_quality ? (поставил 100 в sshot_jpeg_quality (было 90) - на распознование в FINEREADER не повлияло (распознаёт корректно только 80-90%). Через BMP или PNG распознование 100% (цифровой текст типа 1.23-56-85)
Чёт странный какой-то finereader. Сто лет назад, когда я им пользовался в ручном режиме, да он не любил jpeg но неужели сейчас при хорошем качестве это так для него важно.

(поставил 100 в sshot_jpeg_quality (было 90) - на распознование в FINEREADER не повлияло
После изменения параметра кликер перезапускал? Он читает эти параметры только при запуске. Проверял с размером файла, изменился?
sshot_jpeg_quality=100 конечно тоже сжатие с потерями, но на распознавание не должно влиять. Артефактов там нет.

« Last Edit: September 27, 2021, 09:34:29 AM by Vint »