使用 Imagick php 扩展将多页 PDF 转换为 JPG 时出现黑色背景

2023-11-25

使用 Imagick php 扩展将多页 PDF 转换为 JPG 时纠正黑色背景的最佳方法是什么?

以下是我的应用程序中使用的代码:

    $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
  • 将它们合并在一起。

对于每个具有透明度的图层,因为 JPG 不支持透明度,它将透明度渲染为黑色,然后将其合并。上面的代码使合成按正确的顺序完成。

解决该问题的另一种方法是将输出设置为 PNG。由于它支持透明度,具有透明度的各个图层会正确合并,然后如果您确实愿意,您可以将最终图像转换为 JPG。

使用 PNG 作为中间格式还可以产生稍高质量的输出,因为它可以跳过“保存到 JPG 并解码”步骤。我确实建议尽可能在工作流程中使用 PNG,然后仅在向最终用户提供文件时(如果您确实需要额外的压缩)才转换为 JPG。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Imagick php 扩展将多页 PDF 转换为 JPG 时出现黑色背景 的相关文章

  • Swift UIImage 转换为 PDF

    在我的应用程序中 必须从 iPad Gallery 出售 UIImage 并将其转换为 PDF 并保存在服务器端 我可以选择图像并将其发送到服务器端 但后端说 pdf 为空 空数据 我还在控制台中看到警告 错误 发现扩展时遇到 发现 错误
  • 使用邮箱认证注册,只有30%激活?

    我正在使用 php 和 mysql 我的网站是 Flash 的 完整的 Flash 网站 我有一个允许用户注册的网站 注册过程包括发送 激活电子邮件 点击链接激活帐户 前两周还好 在大约 2000 个用户中 有 1800 个用户被激活 此后
  • 在php中设置数据库中的会话

    如何使用 php 和 mysql 在数据库表中使用会话 您需要创建一个像这样的对象 class SessionHandler private static lifetime 0 private function construct obje
  • 如何通过 md5 比较图像?

    该方法是否比较图像的像素值 我猜它不会起作用 因为它们的尺寸彼此不同 但如果它们相同但格式不同怎么办 例如 我截图并保存为 jpg另一个并保存为 gif MD5哈希是实际的二进制数据 因此不同的格式将具有完全不同的二进制数据 因此 要使 M
  • 为数据库生成随机 ID

    我对一个项目有一个要求 我需要生成唯一的 ID ID 必须大写 我无法检查数据库以查看 ID 是否已被使用过 我们预计每个月都会有数百万条记录添加到数据库中 我在这里尝试过解决方案 PHP 如何生成随机的 唯一的字母数字字符串 https
  • 包含 WordPress 之外的 WordPress 内容

    我正在寻找构建 WordPress 网站的移动版本 并将其大部分内置于静态文件中 但我试图从运行移动网站的外部 PHP 文件内部访问 WordPress 内容 如何在不手动编写 SQL 查询的情况下访问循环或数据库 Edit 为了澄清一下
  • 在路线中使用中间件的车队购物车,但我在项目中找不到任何 $routemiddleware...甚至在 kernel.php 中也找不到...我在哪里可以找到它?

    在路线中使用中间件的车队购物车 但我在项目中找不到任何 routemiddleware 甚至在 kernel php 中也找不到 我在哪里可以找到它 Laravel 版本 5 7 护照版本 7 5 CMS 舰队购物车 内核 php name
  • 在非 WordPress php 页面之外显示 WordPress 帖子

    我需要在非 WordPress php 页面中显示 WordPress 博客文章 我已经尝试过以下代码
  • 将jsp表导出到excel、word、pdf

    任何人都可以建议我任何库 jar 文件 我可以使用它们将我的表导出到 excel pdf word 请告诉我是否有任何可以在 jsp 中创建报告的库 还应该提到的是 您只需输出 HTML 表格并将响应类型设置为即可将表格导出到 Excela
  • nginx + php-fpm = 找不到文件

    当我尝试访问时info php我得到一个File not found error 我尝试了一些教程但无济于事 配置 默认 server listen 80 listen 80 default ipv6only on server name
  • MySQL ifnull 相当于 php

    我的场景 exTime get cfg var session gc maxlifetime get cfg var session gc maxlifetime 1440 我希望它像 mysql 一样 exTime isnull get
  • 使用 Stripe 创建订阅后如何获取费用 ID?

    我在用Stripe作为支付网关 现在有一个大问题困扰着我 我使用下面的代码来创建订阅
  • Gmail 搜索怎么这么快?

    搜索这么多字符的最有效方法是什么 你怎么认为 假设网站是用 PHP 和 MySQL 构建的 我应该学习什么才能尽可能有效地构建它 有什么我应该学习的算法吗 文本索引算法 https stackoverflow com questions 4
  • 分页当前链接未突出显示

    我遇到了一个奇怪的问题 我当前的分页链接未突出显示 我制作的分页网址如下所示 site com list 50 some value 一切工作正常 但当前视图中的分页链接未突出显示 我检查了CSS 没问题 我猜问题出在库上 这是我的代码 我
  • PHP通知和警告的区别

    当编写代码错误时 可能会出现警告和通知 我知道错误背后的想法 我想警告是为了通知您可能导致错误的事情 但通知不是完全相同吗 我认为通知并不是某件事做得正确的消息 这让我有点困惑 任何人都可以区分这两者之间的区别以及应该如何处理这些消息 通知
  • 我可以使用 vim “star” 搜索来搜索 PHP 类成员和方法吗?

    vim 星号 星号搜索 help star 是一个很棒的功能 它可以让您找到光标所在单词的下一个出现位置 不幸的是 它将美元前缀视为字符串的一部分 因此如果我在类名中的 SearchTerm 上方按 它会在注释中找到 SearchTerm
  • PHP 多个 Curl 请求

    我目前经常使用 PHP 的 Curl 每次获取100页左右的结果需要花费很多时间 对于每个请求 我都使用这样的代码 ch curl init get source curl close ch 我有什么选择可以加快速度 我应该如何使用mult
  • 使用 PHP MySql 进行关键字搜索?

    我的 mysql 表中有标题 varchar 描述 text 关键字 varchar 字段 我保留了关键字字段 因为我认为我只会在这个字段中搜索 但我现在需要在所有三个字段中进行搜索 所以对于关键字 word1 word2 word3 我的
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • PHP Session Id 在页面之间发生变化

    我有一个问题 我在 2 个页面之间丢失了 PHP 会话 session start 包含在一个名为 session inc php 的文件中 该文件包含在每个需要设置会话的页面中 这适用于网站上除一个特定页面 member profile

随机推荐

  • 使用 ggplot2 以粗体显示各个轴标签

    改编自这个问题和解决方案的问题 使用 ggplot2 以粗体突出显示各个轴标签 我想根据满足标准有选择地证明水平轴标签的合理性 因此 借用上述问题和答案 我设置了一个示例 require ggplot2 require dplyr set
  • 如何在 CSS 中用 div 制作尖箭头

    如何在 CSS 中制作尖箭头 不只是一个三角形 而是一个有茎的三角形 就像用弓射出的传统箭一样 我试图通过创建一个 div 容器来做到这一点 其中包含两个容器 左容器和右容器 右侧将包含三角形 左侧将包含三个 div 其中心将被着色以创建主
  • AdMob 在 Android 中需要哪些权限

    On 谷歌的网站他们只提到其中两个
  • 记录 Excel 自动完成的 VBA 代码

    使用VBA编写要在Excel中使用的自定义函数时 如何编写文档注释以便在自动填充公式期间自动显示Excel 例如 当我们开始输入 VLookUp 时 它会显示 Vlookup 作为工具提示的作用 显示输入变量名称 如果我们按功能区中的 插入
  • 静态变量被初始化两次

    考虑我在编译单元中有一个静态变量 它最终出现在static库 libA 然后我有另一个编译单元访问这个变量 最终出现在shared库 libB so 因此 libA 必须链接到 libB 最后我有一个 main 函数也直接从 A 访问静态变
  • iOS 7 - 调整状态栏

    我无法确定如何调整 iOS7 中的状态栏 我的视图控制器有一个tableView 我想要tableView在状态栏下启动 目前 它与状态栏重叠 顶部的标签是headerView in the tableView 我已通过 IB 在视图控制器
  • 矩阵列表中每个元素的平均值

    我有一个包含三个矩阵的列表 a lt matrix runif 100 b lt matrix runif 100 c lt matrix runif 100 mylist lt list a b c 我想获得三个矩阵中每个元素的平均值 我
  • Python3添加日志级别

    我有这段代码 对我来说效果很好 import logging import logging handlers logger None def create logger global logger logger logging getLog
  • jQuery 点击事件在移动浏览器中不起作用

    jQuery 单击事件似乎没有在移动浏览器中触发 HTML如下 ul class menu li a href home HOME a li li class publications PUBLICATIONS amp PROJECTS l
  • C# 的远程 SQL 服务器的正确连接字符串

    我只想知道远程 sql server Express 版本的正确 sql 连接字符串 这就是我得到的 但我遇到了一些问题 SqlConnection cs new SqlConnection Data Source IP Address P
  • 承诺和摩卡:是否在之前完成()?

    我在读关于摩卡承诺测试的一些教程 有一段代码 before function done return Promise resolve save article then function done Why done 调用在then in t
  • 翻译源代码中的注释和区域名称

    有谁知道批处理程序或 VS 2010 插件 脚本可以让我将注释和区域名称从中文翻译成英文 我发现的唯一一个要么处理所有字符串 要么一次只处理一个字符串 我有两个大型 C 项目正在尝试通读 Thanks 使用 PrepTags 准备要翻译的文
  • C# Socket.Receive 消息长度

    我目前正在开发一个 C Socket 服务器 它可以接受来自多个客户端计算机的多个连接 服务器的目标是允许客户端 订阅 和 取消订阅 服务器事件 到目前为止 我已经很好地观察了这里 http msdn microsoft com en us
  • Excel循环遍历行并将单元格值复制到另一个工作表

    我在实现我的预期结果方面面临一些困难macro 意图 我有一个数据列表sheets input column A 具有值的行数会有所不同 因此我创建了一个循环来运行宏 直到活动单元格为空 我的宏从Range A2 并一直向下延伸到 A 列
  • 为什么我们在nodejs中使用导出?

    我是 Nodejs 的新手 就我而言module exports and exports两者都是空对象 module exports可以暴露函数 whileexports可不至于此 一切都可以通过 module exports 来实现 那么
  • 为什么布尔数据类型没有在 C 中实现

    有朋友问了一个问题 为什么没有BooleanC 编程语言中的数据类型 我做了一些搜索和阅读 我在堆栈溢出中得到了一些问题和答案 所有数据类型都应该是可寻址的 但位不能寻址 主流CPU硬件层面的基本数据结构是字节 对这些 CPU 中的位进行操
  • 在 HTML 中对齐小数点

    我有一个表格 其中一列包含十进制数字 我希望以类似于文字处理程序的 小数制表符 功能的方式对齐它们 以便所有点都位于垂直线上 我目前有两种可能的解决方案 但我希望有更好的解决方案 解决方案 1 拆分 HTML 中的数字 例如 td div
  • Javascript 中的预增量

    我刚刚遇到了 Javascript 中关于预增量的 功能 在我使用过的所有其他语言中 它都像我想象的那样 例如 在 C 中 include
  • 向图像添加水印图像

    我想在我的所有图像中添加一个小的淡出水印图像 有没有办法在 c 中做到这一点 您可以使用System Drawing 1 create a bitmap create a empty one or from file Bitmap bmpP
  • 使用 Imagick php 扩展将多页 PDF 转换为 JPG 时出现黑色背景

    使用 Imagick php 扩展将多页 PDF 转换为 JPG 时纠正黑色背景的最佳方法是什么 以下是我的应用程序中使用的代码 imagick new Imagick file imagick gt setResolution 150 1