Код проверяет, содержит ли конкретное изображение прозрачность.
-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 не существует, так что вам, возможно, придется много переставлять их, но примитивы есть.
Ссылки
- Документация RMagick
- ImageMagick 'fx' убегает
- Опции канала ImageMagick