Каков наилучший способ исправить черный фон при преобразовании многостраничного PDF в JPG с расширением php Imagick?
Ниже приведен код, используемый в моем приложении:
$imagick = new Imagick($file); $imagick->setResolution(150,150); $imagick->setImageFormat("jpg"); $imagick->setImageCompression(imagick::COMPRESSION_JPEG); $imagick->setImageCompressionQuality(70); foreach ($imagick as $c => $_page) { $_page->setImageBackgroundColor('white'); $_page->adaptiveResizeImage($maxsize,$maxsize,true); $_page->writeImage("$file-$c.jpg"); }
Я знаю, что метод flattenImage можно использовать для удаления черного фона, например, в:
$imagick = $imagick->flattenImages();
Но когда файл имеет больше одной страницы, метод flattenImages помещает все страницы на одно и то же изображение, поэтому результат является копией последней страницы во всех сгенерированных JPG.
Я ценю, если кто-нибудь может мне помочь.
Рабочий код – объяснение:
Этот код работает, но невероятно медленный:
$file = "./YORK.pdf"; $maxsize = 500; $imagick = new Imagick($file); $imagick->setResolution(150,150); $imagick->setImageFormat("jpg"); $imagick->setImageCompression(imagick::COMPRESSION_JPEG); $imagick->setImageCompressionQuality(70); foreach ($imagick as $c => $_page) { $_page->setImageBackgroundColor('white'); $_page->adaptiveResizeImage($maxsize,$maxsize,true); $_page->setImageCompose(\Imagick::COMPOSITE_ATOP); $_page->flattenImages(); $_page->writeImage("$file-$c-compose.jpg"); }
Этот код работает и работает быстро:
foreach ($imagick as $c => $_page) { $_page->setImageBackgroundColor('white'); $_page->adaptiveResizeImage($maxsize,$maxsize,true); $blankPage = new \Imagick(); $blankPage->newPseudoImage($_page->getImageWidth(), $_page->getImageHeight(), "canvas:white"); $blankPage->compositeImage($_page, \Imagick::COMPOSITE_ATOP, 0, 0); $blankPage->writeImage("$file-$c.jpg"); }
Я думаю, что происходит то, что когда дело доходит до изображения ImageMagick делает:
Для каждого из слоев с прозрачностью, поскольку JPG не поддерживает прозрачность, он обеспечивает прозрачность как черный, а затем слияние. Приведенный выше код делает композицию в правильном порядке.
Альтернативный способ исправить проблему состоит в том, чтобы вывести его как PNG. Поскольку он поддерживает прозрачность, отдельные слои с прозрачностью сливаются правильно, а затем вы можете преобразовать окончательное изображение в JPG, если хотите.
Использование PNG в качестве промежуточного формата также может привести к получению более качественного результата, поскольку он может пропустить шаг «сохранить в JPG и декодировать». Я рекомендую использовать PNG в рабочем процессе, где это возможно, а затем конвертировать в JPG только тогда, когда вы обслуживаете файл конечному пользователю, если вам действительно нужен дополнительный бит сжатия.