Используйте mogrify для изменения размеров больших файлов при игнорировании маленьких

Если Ваша виртуализация поддержки оборудования, удостоверьтесь, что она активируется в BIOS (некоторые компьютеры имеют функцию, но поставку с отключенным). Затем удостоверьтесь, что “Включают VT-x/AMD-V”, проверяется на вкладке “System  Acceleration” настроек VM.

Если это не решение для Вас, от VirtualBox 4.0, вместо того, чтобы загрузить Minix путем удара Кнопки запуска в VirtualBox, используйте эту команду для запуска VM:

VBoxSDL --startvm "Minix 3" --norawr0 --norawr3

(где "Minix 3" является названием виртуальной машины),

Опция --norawr0, возможно объединенный с --norawr3, может помочь с другими гостевыми операционными системами, такими как OpenBSD, NetBSD, QNX

10
18.05.2012, 17:53
7 ответов

Я думаю mogrify систематически переписывает файл, таким образом, Ваша единственная надежда состоит в том, чтобы отфильтровать список сначала, как предложено jippie. Вот то, как Вы могли бы сделать (непротестированный): распечатайте список файлов изображений с признаком размера, сохраните только имена, связанный размер которых в диапазоне, и обработайте тот список.

identify -format '%w %h %i\n' ./*.png |
awk '$1 > 400 || $2 > 400 {sub(/^[^ ]* [^ ]* /, ""); print}' |
tr '\n' '\0' |
xargs -0 mogrify -resize '400x400'

Объяснение сценария:

  • Для каждого файла распечатайте строку с шириной, пространством, высотой, пространством и именем файла. В зависимости от Вашей версии identify, \n добавить заключительную новую строку может или быть необходимым (ImageMagick 6.6.0) или лишним, но безопасным (GraphicsMagick 1.1.11).
  • (awk) На каждой строке, если ширина ($1) и высота ($2) соответствуйте необходимым условиям, затем:
    • Удалите весь текст до второго пробела. Это разделяет ширину и высоту.
    • Печать, что остается от строки, которая является именем файла.
  • Замените новые строки нулевыми символами.
  • Звонить xargs -0 выполниться mogrify команда на именах файлов. (Мы не можем использовать плоскость xargs потому что это не может иметь дело с входом, содержащим пробел или \'".)

Имена файлов могут содержать любой символ кроме новых строк.

14
27.01.2020, 19:59
  • 1
    можно ли объяснить тот сценарий? Конкретно "sub" часть. Это печатает имена файлов без пространства или вставляет новую строку. mogrify: не мог открыть файл '22 553.png308 400 0134 2.png' error/png.c/ReadPNGImage/2951. Я понятия не имею, куда это "308 400" прибывает из. Я должен упомянуть, что файлы имеют пробелы на свои имена Спасибо. А-ч –  Mike 18.05.2012, 19:15
  • 2
    я получаю mogrify: не мог открыть файл '340 271 22 553.png308 400 0134 2.png' error/png.c/ReadPNGImage/2951. Я выполнил использование команды 200x200 на двух файлах примера. Я вижу, что 308x400 размер одного из файлов –  Mike 18.05.2012, 19:23
  • 3
    @Mike, получил его. Некоторые версии identify автоматически поместите новую строку после того, как каждая запись, у других должна будет быть та явно. Добавить \n в конце аргумента -format (см. мое редактирование). –  Gilles 'SO- stop being evil' 19.05.2012, 15:10

Как насчет использования определяют, чтобы найти размер Вашего изображения и решить из маленького сценария, если Вы хотите отредактировать его или нет:

identify -format "width=%w heigth=%h" bootchart.png 
width=3853 heigth=10092

Не должно быть слишком твердым для редактирования выходного формата для использования в простом сценарии.

3
27.01.2020, 19:59
  • 1
    Рассмотрение моих ограниченных навыков и факта, размеры изображений таким образом неправильны, мне нужен более простой метод. Я обработал бы их всех с mogrify. –  Mike 18.05.2012, 18:13

Я столкнулся с та же проблема, которую вы описали. Вот мое решение:

#!/bin/bash
files=*.jpg
minimumWidth=640
minimumHeight=640

for f in $files
do
    imageWidth=$(identify -format "%w" "$f")
    imageHeight=$(identify -format "%h" "$f")

    if [ "$imageWidth" -gt "$minimumWidth" ] || [ "$imageHeight" -gt "$minimumHeight" ]; then
        mogrify -resize ''"$minimumWidth"x"$minimumHeight"'' $f
    fi
done

Я тестировал его на нескольких изображениях JPEG на виртуализированной машине CentOS 6.5. Сценарий изменял размер и сжимал только изображения, ширина или высота которых превышала 640 пикселей. Это заставило его работать с изображениями с размерами, такими как 800 x 600 (пейзаж, изменение его размера до 640 x 480) и размерами, например, 600 x 800 (портрет, изменение его размера до 480 x 640).

PS: Примечание к параметру 400x400 : mogrify обработает файл, даже если его размеры равны или меньше 400x400, но только изменит размер если его размеры больше 400х400. Поэтому время модификации и размер файлов изменены (в моем случае mogrify сделал эти файлы даже больше , чем они были).

7
27.01.2020, 19:59

Я использую такой PHP-скрипт, он использует ImageMagick:

<?php
$dir = ".";
$exts = array('jpg', 'jpeg', 'png', 'gif');
$max_size = is_numeric($argv[1]) ? $argv[1] : 3000;
$morgify = "mogrify -verbose -scale \"${max_size}x${max_size}>\" -quality 85";
$identify = "identify -format \"%wx%h\"";

$dh = opendir($dir);
while (($file = readdir($dh)) !== false) {
    $path = "$dir/$file";
    // skip no images
    $dot = strrpos($file, '.');
    $ext = strtolower(substr($file, $dot + 1));
    if (!in_array($ext, $exts)) continue;
    // large size?
    $size = exec("$identify \"$path\"");
    list($width, $height) = explode('x', trim($size));
    if (max($width, $height) > $max_size) {
        // scale!
        print "scale $file ${width}x${height}";
        exec("$morgify \"$path\"");
        print "\n";
    }
}
closedir($dh);
?>

Он масштабирует все изображения в текущем каталоге больше 3000 на каком-то краю.

Выполнить команду: php scale.php ИЛИ php scale.php 2000

0
27.01.2020, 19:59

Вы также можете использовать оператор fx для фильтрации изображений по высоте/ширине, например,

identify -format '%[fx:(h>400 && w>400)]\n' image.png

выведет 1, если изображение больше 400x400 и 0, если оно равно или меньше 400x400...


Предполагая нормальные имена файлов (без новых строк/пробелов/табов и т.д.), вы можете использовать identify для печати имен изображений, которым предшествует либо 1:, либо 0: , обработать вывод, удалив строки, начинающиеся с 0: и удалив ведущие 1: в остальных строках, чтобы остались только имена файлов, по одному в строке, затем передать этот список в mogrify . .. @- (синтаксис @ был добавлен в imagemagick v6.5. 2):

identify -format '%[fx:(h>400 && w>400)]:%i\n' ./*.png | \
sed '/^1:/!d;//s///' | mogrify -resize '400x400' -- @-

Иначе, с помощью find вы можете вывести только файлы с размером > 400x400, а затем передать результат в xargs + mogrify (это менее эффективно, так как запускает оболочку для каждого файла, но должно работать со всеми типами имен файлов):

find . -maxdepth 1 -type f -name '*.png' -exec sh -c \
'identify -format "%[fx:(h>400 && w>400)]\n" "$0" | grep -q 1' {} \; -print0 \
| xargs -0 mogrify -resize '400x400'

Если вы являетесь пользователем zsh, смотрите также этот ответ.

5
27.01.2020, 19:59

Вот мой вариант, включающий идеи от @ArionKrause и @don_crissti:

#!/bin/bash
# adapted from http://unix.stackexchange.com/a/157594/110635
# and http://unix.stackexchange.com/a/220619/110635
W=1024
H=768
SIZE_TEST="%[fx:(h>$H && w>$W)]"'\n'

for f in $*; do
  if [ $(identify -format "$SIZE_TEST" "$f") = 1 ]; then
    echo "Resize: $f"
    mogrify -resize ''"$W"x"$H"'' "$f"
  else
    echo "Do not resize: $f"
  fi
done

(Мне это понадобилось, потому что мой любимый пакетный процессор Phatch не работает в Ubuntu 16.04.)

0
27.01.2020, 19:59

Mis funciones para redimensionar y optimizar

resize_and_optimize_images () {
  resize_images 700 $PWD
  optimize_images 85 $PWD
}

resize_images () {
  max="$1"
  dir="$2"

  echo "Resizing dir $dir, max size - $max"

  shopt -s globstar

  for f in $dir/**/*.jpg $dir/**/*.jpeg $dir/**/*.png ; do
    echo "Checking $f"
    s=`identify -format "%w" $f`

    if [ $s -gt $max ]; then
      echo "Resizing..."
      mogrify -verbose -resize $max $f
    fi
    echo
  done

  echo "Done resizing dir $dir"
}

optimize_images () {
  quality="$1"
  dir="$2"

  echo "Optimizing dir $dir, quality - $quality"

  docker run -it --rm --name optimize_images_foo \
    -v $dir:/usr/src/app \
    -w /usr/src/app ruby:2.4-stretch bash -c \
    "gem install image_optim image_optim_pack && \
    (curl -L \"http://static.jonof.id.au/dl/kenutils/pngout-20150319-linux.tar.gz\" | tar -xz -C /usr/bin --strip-components 2 --wildcards \"*/x86_64/pngout\") && \
    image_optim --verbose --allow-lossy --jpegoptim-allow-lossy true --jpegoptim-max-quality $quality --pngquant-allow-lossy true --pngquant-quality 0..$quality -r."

  echo "Done optimizing dir $dir"
}
0
27.01.2020, 19:59

Теги

Похожие вопросы