Если Ваша виртуализация поддержки оборудования, удостоверьтесь, что она активируется в 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 …
Я думаю 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
потому что это не может иметь дело с входом, содержащим пробел или \'"
.)Имена файлов могут содержать любой символ кроме новых строк.
Как насчет использования определяют, чтобы найти размер Вашего изображения и решить из маленького сценария, если Вы хотите отредактировать его или нет:
identify -format "width=%w heigth=%h" bootchart.png
width=3853 heigth=10092
Не должно быть слишком твердым для редактирования выходного формата для использования в простом сценарии.
Я столкнулся с та же проблема, которую вы описали. Вот мое решение:
#!/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
сделал эти файлы даже больше , чем они были).
Я использую такой 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
Вы также можете использовать оператор 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
, смотрите также этот ответ.
Вот мой вариант, включающий идеи от @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.)
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"
}
identify
автоматически поместите новую строку после того, как каждая запись, у других должна будет быть та явно. Добавить\n
в конце аргумента-format
(см. мое редактирование). – Gilles 'SO- stop being evil' 19.05.2012, 15:10