Могу ли я определить, был ли PNG-файл преобразован из многостраничного PDF-файла и разделить изображение на отдельные файлы с помощью ImageMagick?

У меня возникла проблема, когда файл PNG, созданный с использованием функции экспорта PDF в Preview OS X, будет отображаться как анимированный GIF в некоторых браузерах (Safari, Firefox) или отображать только первую страницу (Chrome), если преобразованный PDF-файл имеет более одной страницы (анимированный GIF, я имею в виду, что он мерцает между разными страницами). Есть ли способ использовать PHP для определения того, был ли преобразован загруженный PNG-файл таким образом, а затем разделить его на отдельные изображения и сшить их вместе с помощью ImageMagick?

Это анимированный PNG или файл формата APNG Mozilla. Вы можете обнаружить это, выполнив pngcheck следующим образом:

 pngcheck -v npma33-png-convert-test.png 

Вывод

 File: npma33-png-convert-test.png (981954 bytes) chunk IHDR at offset 0x0000c, length 13 1275 x 1650 image, 32-bit RGB+alpha, non-interlaced chunk acTL at offset 0x00025, length 8 <--- APNG unknown private, ancillary, unsafe-to-copy chunk chunk iCCP at offset 0x00039, length 281 profile name = ICC Profile, compression method = 0 (deflate) compressed profile = 268 bytes chunk pHYs at offset 0x0015e, length 9: 5906x5906 pixels/meter (150 dpi) chunk fcTL at offset 0x00173, length 26 <--- APNG unknown private, ancillary, unsafe-to-copy chunk chunk IDAT at offset 0x00199, length 16384 zlib: deflated, 32K window, superfast compression chunk IDAT at offset 0x041a5, length 16384 chunk IDAT at offset 0x081b1, length 16384 chunk IDAT at offset 0x0c1bd, length 16384 chunk IDAT at offset 0x101c9, length 16384 chunk IDAT at offset 0x141d5, length 16384 chunk IDAT at offset 0x181e1, length 16384 chunk IDAT at offset 0x1c1ed, length 16384 chunk IDAT at offset 0x201f9, length 16384 chunk IDAT at offset 0x24205, length 16384 chunk IDAT at offset 0x28211, length 16384 chunk IDAT at offset 0x2c21d, length 16384 chunk IDAT at offset 0x30229, length 16384 chunk IDAT at offset 0x34235, length 16384 chunk IDAT at offset 0x38241, length 16384 chunk IDAT at offset 0x3c24d, length 16384 chunk IDAT at offset 0x40259, length 16384 chunk IDAT at offset 0x44265, length 16384 chunk IDAT at offset 0x48271, length 16384 chunk IDAT at offset 0x4c27d, length 16384 chunk IDAT at offset 0x50289, length 16384 chunk IDAT at offset 0x54295, length 16384 chunk IDAT at offset 0x582a1, length 16384 chunk IDAT at offset 0x5c2ad, length 16384 chunk IDAT at offset 0x602b9, length 16384 chunk IDAT at offset 0x642c5, length 15969 chunk fcTL at offset 0x68132, length 26 <--- APNG unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x68158, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x6c168, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x70178, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x74188, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x78198, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x7c1a8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x801b8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x841c8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x881d8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x8c1e8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x901f8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x94208, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x98218, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0x9c228, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xa0238, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xa4248, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xa8258, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xac268, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xb0278, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xb4288, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xb8298, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xbc2a8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xc02b8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xc42c8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xc82d8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xcc2e8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xd02f8, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xd4308, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xd8318, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xdc328, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xe0338, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xe4348, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xe8358, length 16388 unknown private, ancillary, unsafe-to-copy chunk chunk fdAT at offset 0xec368, length 14406 unknown private, ancillary, unsafe-to-copy chunk chunk IEND at offset 0xefbba, length 0 

acTL APNG является наличие acTL и fcTL которые являются управлением анимацией и контролем кадров .

Вы можете отключить вывод этих фрагментов (что остановит мерцание), используя следующую команду:

 convert npma33-png-convert-test.png -define png:exclude-chunk=acTL result.png 

но я не тестировал, повлияет ли это на другие вещи, такие как сжатие или какие-либо другие метаданные, поэтому, пожалуйста, сделайте собственные проверки.

Итак, если вы используете bash вы получите что-то вроде этого:

 file="npma33-png-convert-test.png" if pngcheck -v "$file" | grep -q acTL; then convert "$file" -define png:exclude-chunk=acTL "$file" fi 

Ожидаемый способ разделения и воссоединения рамок бок о бок, вероятно, будет

 convert npma.... -separate +append result.png 

или

 convert npma... -coalesce +append result.png 

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

Я также попытался использовать адресацию стиля в стиле Photoshop , но это тоже не работает:

 convert npma...[0] page1.png convert npma...[1] page2.png