Imagick 制作动画 GIF 而不是动画?

2023-12-10

我正在向 imagick 发送图像,当它是动画 gif 时,它会删除动画并留下单个静态图像。这是因为调整大小代码吗?或者它是 imagick 库中固有的东西?下面是我的代码,这里有什么问题吗?

            if (isset($_FILES["image"])) {
                $allowed_ext = array("jpg", "jpeg", "png", "gif");
                $file_name = $_FILES["image"]["name"];
                $file_ext = strtolower(end(explode(".", $file_name)));
                $file_size = $_FILES["image"]["size"];
                $file_tmp = $_FILES["image"]["tmp_name"];

                // verify extension
                if (in_array($file_ext, $allowed_ext) && $file_size < 2097152) {
                    // check if image needs scaling
                    $img = new imagick($file_tmp);
                    $img_size = $img->getImageGeometry();

                    $partyCommentErrors .= "<li>Width: ".$img_size["width"]." | Height: ".$img_size["height"]."</li>";

                    if ($img_size["width"] > 600 || $img_size["height"] > 600) {
                        // resize image
                        $img->resizeImage(600, 600, imagick::FILTER_LANCZOS, 0.9, true);
                    }

                    $img_size = $img->getImageGeometry();
                    $img->writeImage("imgs/commentpics/".$id.".".$file_ext);

                    // update database
                    $qry = "UPDATE comments SET thereisimg=1, imgtype='".$file_ext."', imgwidth='".$img_size["width"]."', imgheight='".$img_size["height"]."' WHERE id=$id";
                    mysqli_query($dblink, $qry);

                } else {
                    $partyCommentErrors .= "<li>File type must be jpg, jpeg, png, or gif</li><li>File size must be less than 2 megabytes.</li>";
                }
            }

因为动画 gif 不是存储为完整图像,而是存储为动画帧之间的差异,因此您需要调用Imagick::coalesceImages能够修改 Gif 中包含的图像。

修改后,您需要调用Imagick::deconstructImages生成帧之间的新差异集,以便能够将它们保存为动画 Gif。

<?php
$imagick = new Imagick("original.gif");

$format = $imagick->getImageFormat();
if ($format == 'GIF') {
  $imagick = $imagick->coalesceImages();
  do {
     $imagick->resizeImage(120, 120, Imagick::FILTER_BOX, 1);
  } while ($imagick->nextImage());
  $imagick = $imagick->deconstructImages();
  $imagick->writeImages('new_120x120.gif', true);

  // can be added some more gifs
  $imagick = $imagick->coalesceImages();
  do {
     $imagick->resizeImage(100, 100, Imagick::FILTER_BOX, 1);
  } while ($imagick->nextImage());
  $imagick = $imagick->deconstructImages();
  $imagick->writeImages('new_100x100.gif', true);
}

$imagick->clear();
$imagick->destroy();

或者,更简单地说:

<?php 
$image = new Imagick($file_src); 

$image = $image->coalesceImages(); 

foreach ($image as $frame) { 
  $frame->cropImage($crop_w, $crop_h, $crop_x, $crop_y); 
  $frame->thumbnailImage($size_w, $size_h); 
  $frame->setImagePage($size_w, $size_h, 0, 0); 
} 

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

Imagick 制作动画 GIF 而不是动画? 的相关文章

  • “警告:mysql_query():提供的参数不是有效的 MySQL-Link” - 为什么?

    我的代码有什么问题吗 我不断收到此错误 Warning mysql query supplied argument is not a valid MySQL Link resource in functions php on line 4
  • 使用 PHP 分割逗号分隔名称

    我的名字格式为姓氏 名字 在我的数据库中 第一个和最后一个字段都有不同的字段 我想使用 PHP 读取逗号之前的所有内容作为姓氏 以及逗号之后的所有内容作为名字 实现这一目标的最佳方法是什么 list Lastname Firstname e
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • 如何在 SQLite 中获取最后插入的 ID?

    SQLite 中是否有任何内置函数可以获取最后插入的行 ID 例如 在 mysql 中我们有LAST INSERT ID 这种功能 对于 sqlite 任何可用于执行相同过程的函数 请帮我 Thanks SQLite 这可以使用SQLite
  • WooCommerce 自定义字段 - 多选

    我在 WooCommerce 的结账页面添加额外的字段 我可以添加文本框等基本字段 但需要添加一个 多 选择框 用户可以在其中选择多个项目 我已经弄清楚如何通过代码添加选择框 如下所示 add action woocommerce afte
  • 提交简单 PHP 表单时出现禁止错误

    我有一个不复杂的问题 这似乎比应有的更复杂 我有一个简单的表单 用于向网站添加内容 有些字段需要输入html 然而 当您在表单的不同部分输入某些 html 元素时 它会认为它讨厌您并抛出禁止的 403 错误 这是下面的表格
  • 传递给 Illuminate\Routing\Middleware\ThrottleRequests::addHeaders() 的参数 1 必须是以下实例

    我创建了一个新的中间件来检查用户令牌我创建了中间件然后添加到 kernal php 但是当我尝试访问中间件中的 request 时我收到错误 这是我的中间件代码 namespace App Http Middleware use Illum
  • Zend 框架会话丢失

    我有一个注册表单 当用户注册时 它会将他重定向到他的页面 在 Firefox 和 Chrome 中一切正常 但在 Internet Explorer 中则正常 看起来保存用户信息后 会话就关闭了 并且不会将用户重定向到他的页面 我该如何解决
  • php/symfony/doctrine 内存泄漏?

    我在使用 symfony 1 4 和原则 1 2 将对象批量插入数据库时 遇到问题 我的模型有一种称为 Sector 的对象 每个对象都有多个 Cupo 类型的对象 通常范围从 50 到 200000 这些物体非常小 只是一个短标识符字符串
  • 在 PHP 中使用可变变量是不好的做法吗?

    例如 一个简单的MVC类型系统 api class method使用重写为 PHP 变量 htaccess nginx conf 然后做类似的事情
  • 带摘要的 php curl 返回两个响应

    我发现了一个 奇怪 的 php CURL 行为 这让我抓狂 基本上我正在做的是使用curl 进行摘要身份验证的调用 这是我的代码的摘录 curl setopt this gt c CURLOPT HTTPAUTH CURLAUTH DIGE
  • 很简单的PHP加法问题

    我想我已经关注这个问题太久了 为什么这段代码打印 no 它应该打印 yes 不是吗 我在 PHP 5 3 和 PHP 5 2 上尝试过 都打印 no See 比较浮点数 http www cygnus software com papers
  • CakePHP Unfilled 单选按钮在提交时更改为不需要的值

    我有这个表单元素 form gt input ChecklistResponseGovernmentInfo driversLicenseIsOnline array type gt radio empty gt true options
  • Google Closure 编译器和 multipart/form-data 不起作用

    我正在向 google 闭包编译器 API 服务发出请求 content file get contents file js url http closure compiler appspot com compile post true p
  • Twitch API - 无法使用 PHP 获取身份验证令牌

    stackoverflow 的成员们大家好 我不是一个喜欢寻求帮助的人 但在这种情况下 我认为这是解决我的问题的唯一方法 谷歌并没有给我太大帮助 所以 我的问题 我想使用 Twitch API 获取一些数据 听起来很容易 我希望是这样 下面
  • PHP 搜索部分字符串

    如何在键入时搜索部分字符串 不使用 MySQL 例如 MySQL 中的 LIKE 函数 但在搜索字符串时使用 PHP 例如 但这显然行不通 但是有没有一个函数可以搜索部分字符串 那太好了 EDIT 如果它在数组中怎么办 如果我使用 strp
  • Google Drive V3、Google API 客户端 2.0 - 批量上传失败

    使用 Google Drive V3 和 API v2 0 主分支进行批量上传失败 我已经修改了https github com google google api php client blob master examples batch
  • 如何在没有 SSH 和 CLI 访问生产的情况下部署 symfony 项目 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 大多数托管提供商仅具有 FTP 访问权限 是否可以 常见地进行 symfony 项目 3 x 或 4 x 的本地安装 然后通过 FTP 上
  • 访问 PHP 数组对象受保护的属性

    我正在尝试在 Symfony2 中上传多个文件 我正在尝试访问以下请求对象 但无法获取参数属性 如何将文件一一上传 我得到的错误 致命错误 无法访问第 66 行 var www File src Webmuch FileBundle Ent
  • jQuery appendTo(), json 在 IE 6,7,8 中不起作用

    我这两天绞尽脑汁想找到解决办法 我使用 jQuery ajax 从数据库中获取值 以便在另一个框发生更改时更新一个框 php 脚本从数据库中获取值 然后输出 json 它在 FF 中工作正常 但在所有版本的 IE 中 选择框都不会更新 我已

随机推荐

  • 处理 INI 文件中重复的节名称

    我需要从 INI 文件加载这些值并使用 C Boost 库在应用程序中打印它们 这些部分具有重复的名称 我被限制只能使用 C Boost 库 numColors 4 boardSize 11 numSnails 2 initializati
  • 如何在Python中确定一周的第一天

    根据区域设置 我需要找到一周的第一天 周日 周一 在JAVA中我会这样做 Calendar FR cal Calendar getInstance Locale FRANCE Calendar CA cal Calendar getInst
  • 如何在docker容器中优雅地关闭tomcat中的servlts?

    到目前为止我发现了什么 docker stop 向容器中的进程 ID 1 发送 SIGTERM 容器中的进程ID 1是运行tomcat的java进程 是的 tomcat 本身会正常关闭 但 servlet 不会这样做 Servlet 会在
  • 在javascript中如何动态获取对象的嵌套属性

    var arr foo 1 bar baz 2 bee 3 function getter variable return arr variable 如果我想要 foo 与 bee 我可以这样做arr variable 这很简单 函数就可以
  • Apache CXF 初始化上的调用方法

    我正处于 如何做 阶段Apache CXF并想知道是否有办法在服务器启动时调用方法 它类似于JSF网络应用程序 当我使用 ApplicationScoped托管 Bean 与eager true 当容器启动时 带注释的类被实例化 我可以从它
  • 改变WinForm边框的样式?

    是否可以更改 WinForm 边框的样式 我知道 如果删除边框 就会失去调整程序大小的功能 因此 有没有办法改变它的样式 但保持它的大小可调 你所寻求的并不简单 因为边界是由操作系统划定的 然而 CodePlex 上有一个库确实可以做到这一
  • OpenMP 卸载了在主机和目标设备中执行的目标区域

    我正在开发一个项目 需要使用 Clang 将 OpenMP 卸载到 Nvidia GPU 我能够按照提到的说明安装 Clang 以支持卸载here 系统规格 操作系统 Ubuntu 16 04 LTS 铿锵 版本 4 00 处理器 Inte
  • 在 Oracle PL/SQL 中从 xml 中提取值

  • 使用 \copy 时的 Postgres 变量替换

    我正在使用 psql 命令 copy 并且我想从 shell 向它传递一个变量 用于表名 就像我在编写查询脚本时所做的那样 我在文档中读到 该命令的语法与 SQL COPY 命令类似 请注意 因此 特殊的解析规则适用于 copy 命令 特别
  • 使用 web.config 文件在 IIS 中看似简单的重定向

    我重组了一个托管在 Windows 服务器上的 WordPress 网站 因此我尝试使用 web config 文件进行重定向 我已经尝试了几十种示例的变体 但无法使其工作 新的 url 已更改为 www mysite com wp wha
  • 在 Folium 中突出显示一个特定国家

    我有一张由folium绘制的地图 如下 m folium Map location 51 1657 10 4515 zoom start 6 min zoom 5 max zoom 7 如何摆脱邻国而只保留德国 或者邻国变得褪色 模糊 苍白
  • 如何从 LotusScript 代理调用 SOAP 1.2 Web 服务?

    我在 Windows 服务器上使用 Lotus Domino 9 我必须打电话给Soap 1 2不再维护的网络服务 莲花Web 服务消费者只接受Soap 1 1web 服务 所以我不能使用这个很好的功能来绑定我的 web 服务 是否可以致电
  • 在 C 中转换向量的 C++ 实现

    我用 C 编写了以下代码 但是发现我必须将其转换为 C 我不是 C 甚至 C 程序员 请帮忙 有人可以帮我将此方法更改为 C 指令 特别是向量实现 以下将无法编译我已经删除了复杂性以保持简单 感谢期待 declspec dllexport
  • 编码的共享 URI 中的站点无效

    我尝试使用 Microsoft Graph 从共享链接中提取一些文件 但是 当我尝试使用 Microsoft Graph Explorer 执行此操作时 它返回 error code invalidRequest message The s
  • 我无法全局安装nodemon,“nodemon”无法识别

    我想使用 nodemon 来监视我的 node js 应用程序 然后执行下一行命令 npm install g nodemon or npm install nodemon g 当我移动到我的应用程序文件夹并尝试 nodemon app j
  • 引用计数降至零后多久调用 __del__ ?

    引用计数达到零后多久 del 方法调用 该语言是否承诺在任何其他使用代码执行之前它会立即完成 或者每个实现都可以做它喜欢的事情 可能会延迟对 del 任意长 请忽略程序即将退出时的情况 我认为这意味着给定块中的最后一条语句已完成 并且堆栈为
  • 以高于屏幕分辨率的 dpi 打印表单

    Problem 我们需要有关如何使用 WinForms 自动缩放到不同 DPI 的功能的帮助 以便我们能够以 600 dpi 而不是屏幕 DPI 打印表单 对于 所见即所得 打印 我们只是简单地使用布局精美的窗口并打印它 关闭滚动条和按钮等
  • pandas drop_duplicates 不可散列类型:'numpy.ndarray'、'set' 和 'list'

    我正在尝试使用drop duplicates在a的一列上dataframe A len 1 2 2 1 2 2 3 1 4 5 2 4 5 2 结果dataframe应该看起来像 A len 1 2 2 3 1 4 5 2 我努力了df d
  • AffineTransform 截断图像

    我有一个图像 我必须将其旋转 45 90 135 180 度 我在做什么 try BufferedImage src ImageIO read new File src png double ang Math toRadians 90 Af
  • Imagick 制作动画 GIF 而不是动画?

    我正在向 imagick 发送图像 当它是动画 gif 时 它会删除动画并留下单个静态图像 这是因为调整大小代码吗 或者它是 imagick 库中固有的东西 下面是我的代码 这里有什么问题吗 if isset FILES image all