#image #png #alpha #graphicsmagick
#изображение #png #альфа #graphicsmagick
Вопрос:
Я пытаюсь проверить, действительно ли изображение прозрачно, а не просто проверять альфа-канал.
Для демонстрации давайте создадим изображение a.png
с альфа-каналом, но полностью непрозрачное, и такое же изображение, b.png
за исключением одного полупрозрачного пикселя:
gm convert rose: PNG32:a.png
gm convert rose: -fill '#0008' -draw "matte 10,10 point" PNG32:b.png
С помощью ImageMagick мы можем легко проверить прозрачность с помощью %[opaque]
$ identify -format '%[opaque]' a.png
true
$ identify -format '%[opaque]' b.png
false
Что эквивалентно graphicsmagick, %A
только проверьте, поддерживается ли прозрачность, а не то, что изображение на самом деле прозрачно.
Ответ №1:
Обновленный ответ
С тех пор на ум пришел немного более простой метод. Прочитайте оригинальный ответ ниже, чтобы понять, что я делаю.
Вы можете извлечь канал альфа / непрозрачности с помощью gm
, и тогда вам не придется беспокоиться о нескольких каналах в выводе -verbose
информации:
gm convert b.png -channel opacity -verbose info:-
Пример вывода
gm convert a.png -channel opacity -verbose info:-
a.png PNG 70x46 0 0 DirectClass 8-bit 7.6Ki 0.000u 0m:0.000000s
Image: a.png
Format: PNG (Portable Network Graphics)
Geometry: 70x46
Class: DirectClass
Type: grayscale
Depth: 1 bits-per-pixel component
Channel Depths:
Gray: 1 bits
Channel Statistics:
Gray:
Minimum: 0.00 (0.0000)
Maximum: 0.00 (0.0000)
Mean: 0.00 (0.0000)
Standard Deviation: 0.00 (0.0000)
Filesize: 0
Interlace: No
Orientation: Unknown
Background Color: white
Border Color: £DFDFDF
Matte Color: £BDBDBD
Page geometry: 70x46 0 0
Compose: Over
Dispose: Undefined
Iterations: 0
Compression: Zip
Png:IHDR.color-type-orig: 6
Png:IHDR.bit-depth-orig: 8
Signature: d7e8478261a01c7f4c4f6bbb172976d1bd585c1b43195cdb65bafb008f71b5c6
Tainted: True
a.png INFO 70x46 0 0 DirectClass 8-bit 0.000u 0m:0.010000s
Теперь вы можете просто искать ( grep
) и подсчитывать ( -c
) строки, содержащие слово "Maximum:"
, за которым следуют любые цифры, отличные от нуля. Таким образом, вы получите ноль или единицу ( -m1
) в качестве выходных данных:
gm convert b.png -channel opacity -verbose info:- 2>amp;1 | grep -c -m1 "Maximum:.*[1-9]"
Оригинальный ответ
Мммм, GraphicsMagick во многих отношениях несколько менее развит, чем ImageMagick!
На ум приходит пара идей. Если вы запустите:
gm identify -verbose a.png > a.txt
gm identify -verbose b.png > b.txt
и разделите их, вы увидите различия следующим образом:
Итак, вы можете либо найти "Type: true color with transparency"
, либо посмотреть Channel Statistics->Opacity->Maximum
и проверить, больше ли оно нуля. Это несколько сложно для поиска, потому что слово Opacity:
встречается дважды, но вы можете сделать это awk
следующим образом:
gm identify -verbose a.png | awk '/Channel Statistics:/{f=1} (f==1)amp;amp;/Opacity:/{f=2} (f==2)amp;amp;/Maximum:/amp;amp;($2>0.00){print "Non-opaque pixel found"}'
Итак, я в основном проверяю, что я видел "Channel Statistics:"
, "Opacity:"
а затем ищу "Maximum:"
, а затем проверяю, превышает ли второй столбец ноль.
Надеюсь, это поможет!