Черный фон при преобразовании многостраничного PDF в JPG с расширением php Imagick

Каков наилучший способ исправить черный фон при преобразовании многостраничного 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.

Я ценю, если кто-нибудь может мне помочь.

Related of "Черный фон при преобразовании многостраничного PDF в JPG с расширением php Imagick"

Рабочий код – объяснение:

Этот код работает, но невероятно медленный:

 $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
  • Объедините их друг над другом.

Для каждого из слоев с прозрачностью, поскольку JPG не поддерживает прозрачность, он обеспечивает прозрачность как черный, а затем слияние. Приведенный выше код делает композицию в правильном порядке.

Альтернативный способ исправить проблему состоит в том, чтобы вывести его как PNG. Поскольку он поддерживает прозрачность, отдельные слои с прозрачностью сливаются правильно, а затем вы можете преобразовать окончательное изображение в JPG, если хотите.

Использование PNG в качестве промежуточного формата также может привести к получению более качественного результата, поскольку он может пропустить шаг «сохранить в JPG и декодировать». Я рекомендую использовать PNG в рабочем процессе, где это возможно, а затем конвертировать в JPG только тогда, когда вы обслуживаете файл конечному пользователю, если вам действительно нужен дополнительный бит сжатия.