Перейти к содержанию

Изменение размеров изображений

меню выполнение

Если интегрировать скрипт в меню файлового менеджера.

  • можно выделять несколько папок сразу
  • изображения будут обработаны для копий папок. Исходники не пострадают
  • работает рекурсивно - глубина не ограничена
  • обрабатывает по *.jpg маске
  • при указании только Width или только Height масштабирует без обрезки с сохранением пропорций исходных изображений
  • при указании Width x Height - выдает заданный размер. Растягивает, центрует если нужно.

resize-image-2.1.sh

#!/bin/bash
set -e

function cropXY {
    local fname=$1
    local fnameNew="$1 RESIZED $2x$3"
    cp "$fname" "$fnameNew" -r
    find "$fnameNew" -name "*.jpg" -print0 | xargs -0 mogrify -resize "$2"x"$3"^ -gravity Center -extent "$2"x"$3"
}

function cropX {
    local fname=$1
    local fnameNew="$1 RESIZED width-$2"
    cp "$fname" "$fnameNew" -r
    find "$fnameNew" -name "*.jpg" -print0 | xargs -0 mogrify -resize "$2"
}

function cropY {
    local fname=$1
    local fnameNew="$1 RESIZED height-$2"
    cp "$fname" "$fnameNew" -r
    find "$fnameNew" -name "*.jpg" -print0 | xargs -0 mogrify -resize x"$2"
}

function getCropSizes {
    local -r inp=$(
        zenity --forms --separator="x" \
            --text "min - max\r${minSize} - ${maxSize} px" \
            --add-entry "X ширина px" \
            --add-entry "Y высота px"
    )
    if [[ -z $inp ]]; then
        exit 1
    else
        echo "$inp"
    fi
}

function ifFolderNotSelected {
    if [[ -z $1 ]]; then
        echo "папки не выбраны"
        zenity --error --text="Папки не выбраны"
        exit 0
    fi

}

# ============= params ==============
minSize=50
maxSize=5000
IFS='
'

# ============= execute ==============
ifFolderNotSelected "$1"

crop_sizes=$(getCropSizes)
X=$(echo ${crop_sizes} | cut -d "x" -f 1)
Y=$(echo ${crop_sizes} | cut -d "x" -f 2)

if ((maxSize > X && X > minSize && maxSize > Y && Y > minSize)); then
    echo "X и Y"
    for folder in "${@}"; do
        cropXY "$folder" "$X" "$Y"
    done | zenity --progress --pulsate --auto-close
elif ((maxSize > X && X > minSize)); then
    echo "только X"
    for folder in "${@}"; do
        cropX "$folder" "$X"
    done | zenity --progress --pulsate --auto-close
elif ((maxSize > Y && Y > minSize)); then
    echo "только Y"
    for folder in "${@}"; do
        cropY "$folder" "$Y"
    done | zenity --progress --pulsate --auto-close
else
    echo "размеры указаны неверно"
    zenity --error --text="Размеры указаны неверно. Убедись что вводишь цифры и соблюдаешь допустимые границы"
fi
resize-image-1.0.sh
  • можно выделять несколько папок сразу
  • мастабирует по ширине Width
  • маска *.jpg без рекурсии
  • исходники не затрагивает
#!/bin/bash

function smaller {
    mkdir -p $1
    mogrify -verbose -path $1 -resize $2 $3/*.jpg
}

# ============= params ==============
default_size=900

# ============= execute ==============

default_size=$(zenity --title  "Укажи размер" --entry --text "Размер картинок по ширине px:" --entry-text "${default_size}")

IFS='
'
for pholder in ${@}; do
    smaller "${pholder}-ширина-${default_size}" ${default_size} ${pholder}
done | zenity --progress --pulsate --auto-close