Понимание консольной утилитой ImageMagick-Convert и перевод в Ruby RMagick
Мне не удается перевести следующий код PHP / ImageMagick в Ruby RMagick (чтобы сделать его более управляемым для будущих пользователей и понять, что он на самом деле делает):
$output = array();
$returnValue = 0;
$pngFiles = $myDir->find("/.png$/i");
foreach($pngFiles as $pngFile) {
$cmd = 'convert '.$pngFile->path.' -resize 1x1 -alpha on -channel o -format "%[fx:u.a]" info:'
exec($cmd, $output, $returnValue);
if($output[0] != 1) {
logMessage("PNG file contains some alpha transparency and will not be modified");
}
}
Например: почему это $output[0] != 1 иногда ... true на PNGs в $myDir, но Rmagick's Image.alpha? есть всегда true на PNGs в $myDir? Я что-то упустил?
%[fx:u.a]).
Update : тем временем я написал сценарий, для которого мне нужна была эта информация. Вы можете проверить это на Github, Если это вам поможет.
5 ответов:
Код проверяет, содержит ли конкретное изображение прозрачность.
-format '%[fx:u.a]' info:Это дает команду image magick проверить первое изображение
u, альфа-канал этогоaи вывести информацию о нем, он вернет 0, если верхний левый пиксель прозрачен и ненулевой, если нет, я думаю. Именно поэтому размер изображения изменяется до 1x1, так что требуется только один пиксель.-channel o- это канал непрозрачности.Таким образом, код на английском языке будет гласить: цикл во всех файлах PNG смотрите только на альфа-канал (непрозрачность), измените размер до одного пикселя и посмотрите, прозрачен ли он. Отсюда и Эхо-сообщение.
К сожалению, я не знаю Ruby или RMagick, но быстрый взгляд на API, кажется, предлагает использовать
image.channel(AlphaChannel)для получения Альфа-канала (AlphaChannelявляется значениемChannelType, не уверен, Нужно ли указыватьChannelType.AlphaChannel), затем следовать с.resize(1,1), чтобы уменьшить размер, и закончить либо с.pixel_color(0,0), либо с.get_pixels(0,0,1,1), чтобы вернуть объектPixel(get_pixels()возвращает массив), который, как я полагаю, имеет атрибутopacity. Однако командаchannel()изменяет значения RGB на значение выбранного канала, и я не уверен, что она сохраняет канал непрозрачности, поэтому вам, возможно, просто нужно посмотреть на red forinstance или полностью опустить вызов.channel(), хотя я не знаю, нарушит ли это результат.Возможно, если Ruby поддерживает достойные подходы функционального программирования.
image.channel(AlphaChannel).resize(1,1).pixel_color(0,0).redИли это, если
pixel_color()не возвращает непрозрачность для некоторых причинаimage.channel(AlphaChannel).resize(1,1).get_pixels(0,0,1,1)[0].redБез
channel()вызовов это было бы:image.resize(1,1).pixel_color(0,0).opacityИли
Опять же, мой Рубин не существует, так что вам, возможно, придется много их переставлять, но примитивы есть.image.resize(1,1).get_pixels(0,0,1,1)[0].opacityСсылки
Для тех, кто все еще ищет решение этой проблемы, есть способ сделать это в ruby, используя
rmagickдрагоценный камень, описанный здесь https://stackoverflow.com/a/41282162/1975112
Php-код, который вы показываете (который на самом деле просто отправляет работу для преобразования в оболочке), не проверяет, есть ли у изображений Альфа-каналы, он просто берет любой файл и включает его. Если бы он уже был один, то не было бы никакого изменения файла, но convert не просят принять какое-либо решение на основе статуса, просто идите вперед и добавьте канал.
Почему вы не скопировали только команду и не вызвали ее с помощью system ?
Драгоценные камни не требуются ... никаких вопросов, код должен выглядеть почти так же.
EDIT: RMagic только обертывает imagemagic, так зачем беспокоиться о rmagic, если у вас уже есть командная строка imagmagic.
Я никогда не кодировал ни одной строки Ruby, но вот частичный ремейк PHP-скрипта:
Я думаю, что единственное, что вам нужно проверить, это просто альфа-канал, а не все эти сложные вещи. Смотрите на этой странице для получения дополнительной информации: http://www.imagemagick.org/script/escape.php у него есть операторrequire 'find' pngFiles = Dir.glob("*.png") Find.find('./') do |f| if system 'convert ' + f + ' -resize 1x1 -alpha on -channel o -format "%[fx:u.a]" info' do print "PNG file contains some alpha transparency and will not be modified"%A, и он выводит что-то о альфа-канале.