Понимание преобразования и перевода ImageMagick на Ruby RMagick - PullRequest
4 голосов
/ 09 ноября 2010

Мне не удается перевести следующий код 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");
   }
}

К настоящему времени Мне показалось, что я более или менее понял, что делает команда convert, но перевод ее в RMagick заставляет меня переосмыслить это.

Например: почему $output[0] != 1 иногда true для PNG в $myDir, но RMagick Image.alpha? равен всегда true для PNG в $myDir?Я что-то пропустил?

Я думаю, что лучший способ вернуть меня в нужное русло, если бы кто-нибудь мог объяснить мне, что именно выполняет команда convert (включая выражение %[fx:u.a]).

Обновление : Тем временем я написал сценарий, для которого мне нужна эта информация.Вы можете проверить это на Github , если это вам поможет.

Ответы [ 5 ]

5 голосов
/ 20 ноября 2010

Код проверяет, содержит ли конкретное изображение прозрачность.

-format '%[fx:u.a]' info:

Это инструктирует магию изображения проверять первое изображение 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 на значение выбранного канала, и я не уверен, что он сохраняет канал непрозрачности, поэтому вам может понадобиться просто посмотреть на красный для экземпляра или полностью пропустить вызов .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 не существует, так что вам, возможно, придется много переставлять их, но примитивы есть.

Ссылки

  1. Документация RMagick
  2. ImageMagick 'fx' убегает
  3. Опции канала ImageMagick
1 голос
/ 22 декабря 2016

Публикуя это для тех, кто все еще ищет решение, есть способ сделать это в ruby, используя гем rmagick, описанный здесь https://stackoverflow.com/a/41282162/1975112

0 голосов
/ 14 ноября 2010

почему вы не скопировали только команду и вызвали ее с системой?

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

РЕДАКТИРОВАТЬ: RMagic только переноситimagemagic, так зачем беспокоиться о rmagic, если у вас уже есть командная строка imagmagic.

0 голосов
/ 19 ноября 2010

Я никогда не кодировал ни одной строки Ruby, но вот частичный римейк сценария 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"

Я думаю, что вам нужно проверить только альфа-канал, а не все эти сложные вещи. Посмотрите на эту страницу для получения дополнительной информации: http://www.imagemagick.org/script/escape.php. Он имеет оператор %A, который выводит что-то об альфа-канале.

0 голосов
/ 09 ноября 2010

Показанный вами php-код (который на самом деле просто отправляет работу для преобразования в оболочке) не проверяет, есть ли на изображениях альфа-каналы, он просто берет любой заданный файл и включает его.Если он уже был, изменений в файле не было бы, но конвертировать не требуется, чтобы принимать какие-либо решения в зависимости от статуса, просто добавьте канал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...