Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > WordPress и другие CMS
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2023, 22:52   #1
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,608
По умолчанию gimp скрипт Script-Fu для уменьшения размера, сжатия изображений в linux в командной строке через терминал на Ubuntu

Процесс преобразования в Ubuntu

Чтобы сохранить Script-Fu и в последсвии запустить для пакетной обработки изображений

В домашней папке нашёл папку Gimp - .gimp-2.8
В этой папке нашёл и перешёл в папку scripts

Там создал файл
batch-resize.scm

В котором создал и сохранил скрипт

Код:
(define (batch-resize pattern)
    (let* 
        ((filelist (cadr (file-glob pattern 1))))
        (while (not (null? filelist))
            (let* (
                    (filename (car filelist))
                    (image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
                    (drawable   (car (gimp-image-active-drawable image)))
                    (cur-width  (car (gimp-image-width image)))
                    (cur-height (car (gimp-image-height image)))
                    (width      (* 0.25 cur-width))
                    (height     (* 0.25 cur-height))
                )
                (gimp-message filename)
                (gimp-image-scale-full image width height INTERPOLATION-CUBIC)
                (let 
                    ((nfilename (string-append "out/" filename)))
                    (gimp-file-save RUN-NONINTERACTIVE image drawable nfilename nfilename)
                )
                (gimp-image-delete image)
            )
            (set! filelist (cdr filelist))
        )
    )
)

В статьях по работе со скриптами рекомендуют обновлять подгружённые скрипты, потому запустил Gimp
Там перешёл по навигации вкладки Фильтры - Script-Fu - Обновить сценарии
В любом случае, этой операцией проверил на работоспособность GIMP, что он есть и он запускается )
Закрыл Gimp

Для работы с изображениями, в домашней папке создал папку imageresize
В папке imageresize создал папку process

поместил туда изображения для обработки - уменьшения размера в 4 раза в длину и ширину, для сжатия с меньшим занимаемым местом на хостинге, расчётное преобразование в 10-20 раз, картинка в 8 мегабайт пережимается до 400 килобайт, в 5 мегабайт до 300 кб.
Gimp не только уменьшает размер за счёт уменьшения, но и оптимизирует JPG сжатие, по своим алгоритмам.

Создал в папке с изображениями папку out, она упоминается в скрипте - "out/" нужно обратить на это внимание

Работать со скриптом буду через командную строку, в Ubuntu она называется Терминал

Выполняю команды перехода в каталог с изображениями
Код:
cd imageresize
cd process
dir
Теперь вы можете убедиться что работаете с теми файлами, что надо
Отмечу, что в папке должны быть только изображения, так как для обработки будет передаваться, маска "*.*"

Запустил команду пакетной обработки изображений через скрипт, сохранённый в скриптах Gimp
Код:
gimp -i -b '(batch-resize "*.*")' -b '(gimp-quit 0)'
Следует обратить внимание на то что процесс довольно долгий, в командной строке множетсво отчётов по ошибкам, но все изображения при этом конвертируются.

Ошибки для примера, на которые я не обращаю внимания

===================
Код:
While parsing XMP metadata:
Ошибка в строке 42 символ 1: Окончание тэга <exif:Flash> не допустимо в данном контексте
======================
Код:
script-fu-Предупреждение: 

Metadata parasite seems to be corrupt
===================
Код:
While parsing XMP metadata:
Ошибка: пакет XMP не найден
===============

Сейчас произвёл обработку 1*088 объектов, всего 20,4 МБ стало, а было 1*088 объектов, всего 179,1 МБ

Следовательно пережаты все изображения с коэффициентом сжатия 20,4÷179,1 = 0,113902848
Что-то около в 9 раз

Далее удалил исходные изображения, оставив в папке out только, чтобы не пережать второй раз.

Отмечу, что это папка process, а сами исходники лежат в архиве в другом месте, чтобы была возможность, по необходимости, вернуться к исходным файлам изображений.

Обработка следующей партии

Скопировал изображения в папку process, создал внутри папку out, запустил команду обработки, пронаблюдал за листом ошибок и предупреждений, в конце получил сообщение

Код:
batch command executed successfully
сравнил эффективность сжатия -

2*128 объектов, всего 63,8 МБ, а было 2*128 объектов, всего 619,0 МБ
Сжатие чуть меньше чем в 10 раз.

В конце удалил обработанные файлы.

Обратить внимание, что если в папке окажется не файл изображения, процесс не будет закончен и не все файлы конвертируются, потому и нужно проверять сколько было и сколько стало файлов.

Ошибка у меня вылетает такая

Код:
Изображение JPEG-Предупреждение: Not a JPEG file: starts with 0x52 0x49

batch command experienced an execution error:
Error: (<unknown> : 164173557) Procedure execution of gimp-file-load failed
Причём имя ошибочного файла отработчик ошибок почему-то не передаёт )

Чтобы ошибка не повторялась, удалил затесавшиеся файлы не картинки.

Третий запуск

Стало 240 объектов, всего 8,4 МБ, было 240 объектов, всего 95,2 МБ

Сжатие больше чем в 11 раз, тут были самые большие файлы по 9MB весом, в предыдущих прогонах были 5MB фотографии или меньше.
Alar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу скачать cpplint через терминал Ubuntu alex_titanic Помощь студентам 9 26.06.2022 01:37
Управление программой через терминал ubuntu aank10 Qt и кроссплатформенное программирование С/С++ 4 06.06.2013 22:13
работа в командной строке Linux Владилена Помощь студентам 0 10.10.2011 16:55
Ubuntu 10.10 и установка программ через терминал. Даниил_глазко Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 2 17.04.2011 21:01