Определить, является ли изображение прозрачным в GraphicsMagick

#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:" , а затем проверяю, превышает ли второй столбец ноль.

Надеюсь, это поможет!