使用 GD 调整图像大小和裁剪图像,同时保留纵横比

2024-01-06

我目前正在编写一个基于Uploadify 的上传器脚本。现在,我调整给定图像和水印的大小之一。这一切都运行良好,但我需要脚本来调整高度大小,然后裁剪宽度,以便长宽比不会混乱。

到目前为止,这是我的代码:

if ($fileExtension == "jpg" || 
        $fileExtension == "jpeg" || 
        $fileExtension == "png" || 
        $fileExtension == "gif"){

        // GD variables:
        list($width, $height, $type) = GetImageSize($uploadedFile['tmp_name']);

        // Image sizes:
        $bigImage = array(800, 453);
        $mediumImage = array(410, 231);
        $listImage = array(120, 68);
        $thumbnail = array(90, 51);

        $sourceAspect = $width / $height;
        $bigAspect = $bigImage[0] / $bigImage[1];
        $mediumAspect = $mediumImage[0] / $mediumImage[1];
        $listAspect = $listImage[0] / $listImage[1];
        $thumbnailAspect = $thumbnail[0] / $thumbnail[1];

        // Image is PNG:
        if ($type == IMAGETYPE_PNG){
            $image = imagecreatefrompng($uploadedFile['tmp_name']);
            $valid = true;
        }

        // Image is JPEG:
        else if ($type == IMAGETYPE_JPEG){
            $image = imagecreatefromjpeg($uploadedFile['tmp_name']);
            $valid = true;
        }

        // Image is GIF:
        else if ($type == IMAGETYPE_GIF){
            $image = imagecreatefromgif($uploadedFile['tmp_name']);
            $valid = true;
        }

        // Format not allowed:
        else {
            $valid = false;
        }

        // Start creating images:
        if ($valid){

            // Get size:
            $imageSize = getimagesize($uploadedFile['tmp_name']);

            // Generate canvas:
            $bCanvas = imagecreatetruecolor($bigImage[0], $bigImage[1]);
            $mCanvas = imagecreatetruecolor($mediumImage[0], $mediumImage[1]);
            $lCanvas = imagecreatetruecolor($listImage[0], $listImage[1]);
            $tCanvas = imagecreatetruecolor($thumbnail[0], $thumbnail[1]);

            // Copy content:
            imagecopyresampled($bCanvas, $image, 0, 0, 0, 0, ($bigImage[0] * $sourceAspect), ($bigImage[1] / $sourceAspect), $imageSize[0], $imageSize[1]);
            imagecopyresampled($mCanvas, $image, 0, 0, 0, 0, $mediumImage[0], $mediumImage[1], $imageSize[0], $imageSize[1]);
            imagecopyresampled($lCanvas, $image, 0, 0, 0, 0, $listImage[0], $listImage[1], $imageSize[0], $imageSize[1]);
            imagecopyresampled($tCanvas, $image, 0, 0, 0, 0, $thumbnail[0], $thumbnail[1], $imageSize[0], $imageSize[1]);

            // Save images:
            $saveB = imagejpeg($bCanvas, $targetFile.'_big.jpg', 90);
            $saveM = imagejpeg($mCanvas, $targetFile.'_medium.jpg', 90);
            $saveT = imagejpeg($lCanvas, $targetFile.'_list.jpg', 90);
            $saveT = imagejpeg($tCanvas, $targetFile.'_thumb.jpg', 90);

            // Destroy images:
            imagedestroy($image);
            imagedestroy($bCanvas);
            imagedestroy($mCanvas);
            imagedestroy($lCanvas);
            imagedestroy($tCanvas);

            // Watermark images:
            $mark = imagecreatefrompng("logo.png");
            list($mwidth, $mheight) = getimagesize("logo.png");
            $img = imagecreatefromjpeg($targetFile.'_big.jpg');

            list($bwidth, $bheight) = getimagesize($targetFile.'_big.jpg');
            imagecopy($img, $mark, $bwidth-$mwidth-25, $bheight-$mheight-25, 0, 0, $mwidth, $mheight);
            imagejpeg($img, $targetFile.'_big.jpg', 100);
            imagedestroy($img);

        } else {
            echo "0";
        }

    } else {
        move_uploaded_file($tempFile,$targetFile.'.'.$fileExtension);
    }

如果有人能帮助我解决这个问题,我会非常高兴。我一直在尝试几种方法,但似乎没有一个能正常工作。正如您在顶部看到的,我已经在变量“bigImage”、“mediumImage”、“listImage”和“thumbnail”中定义了要使用的画布尺寸。

提前致谢! // 乔纳森


调整图像大小的方法不止一种。我会为你拼出它们:

  • 拉伸以适合 - 将图像大小调整为所需大小,忽略纵横比
  • 缩放以适合 http://salman-w.blogspot.com/2008/10/resize-images-using-phpgd-library.html-- 调整图像大小,使一个维度(宽度或高度)具有所需的大小,而另一个维度相同或更短,同时保持纵横比(可能需要一个额外的步骤来用纯色填充较短的一侧)
  • 裁剪以适合 http://salman-w.blogspot.com/2009/04/crop-to-fit-image-using-aspphp.html-- 调整图像大小,使一个维度(宽度或高度)具有所需的大小,而另一个维度相同或更长,同时保持纵横比(需要一个额外的步骤来修剪外部区域)

PS:这两篇文章都是我写的。

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

使用 GD 调整图像大小和裁剪图像,同时保留纵横比 的相关文章

  • 如何只允许从我的 iOS 应用程序访问我的 MySQL 数据库? (使用webapp作为数据库的网关)

    我的 iOS 应用程序需要连接到 mysql 服务器 为了实现这一目标 我想创建一个 Web 应用程序 充当客户端应用程序和服务器端数据库之间的中间人 我担心的是 有人可以简单地找出我的应用程序使用的 URL 并传递他们自己的 URL 参数
  • PHP:如何使用 nl2br() 和 HTML Purifier 保持换行?

    Issue 使用时HTML 净化器 http htmlpurifier org 为了处理用户输入的内容 换行符不会被转换为 br tags 考虑以下用户输入的内容 Lorem ipsum dolor sit amet This is ano
  • 在 Angular 6 中添加 Xsrf-Token 时出现问题

    通过 API 提交的表单中的数据已成功发布 但是将 X CSRF TOKEN 添加到标头并设置后withCredentials true结果数据未发布到名为的脚本insert php Error 加载失败http localhost sim
  • 谷歌图片搜索API

    我有一个网站 用户可以在其中提交图片 我想用这些图片自动在 Google 上进行搜索 以尽量减少图片被从其他网站盗用的可能性 我知道 Firefox 扩展 但这需要我右键单击每张图片并等待结果出现 我想自动化这个 我一直在寻找 API 但
  • PHP Session Id 在页面之间发生变化

    我有一个问题 我在 2 个页面之间丢失了 PHP 会话 session start 包含在一个名为 session inc php 的文件中 该文件包含在每个需要设置会话的页面中 这适用于网站上除一个特定页面 member profile
  • 通过 AJAX 加载的页面上的 reCAPTCHA 字段不会加载。建议?

    实例 没有 AJAX http utsarotaract org inc email php 使用 AJAX 单击给我们发送电子邮件链接 http utsarotaract org contact php 当我查看源页面时 一切正常 但是当
  • PDO::bindValue() 在使用嵌套 SELECT 进行查询时失败

    我正在使用通过 ODBC 连接的 MSSQL 数据库 使用时PDO bindValue 在具有嵌套 SELECT 语句的查询上 它无法绑定嵌套 SELECT 中的值 在主 SELECT 上没有问题 这是一段失败的示例代码 stmt cmdb
  • 使用 PHP 读取 cookie

    我正在尝试读取我用 javascript 设置的 cookie 特别是 jQuery Cookie 插件 然后我用 PHP 读取它以将其写入数据库 由于某种原因 cookie 是在页面加载时创建的 但在页面刷新之前并不 存在 这意味着我正在
  • 更改数组键而不更改顺序

    You can 更改 数组元素的键 https stackoverflow com questions 240660 in php how do you change the key of an array element只需设置新密钥并删
  • 地理位置邻近搜索

    应用程序中有一个要求 要求在谷歌地图中找出与特定国家和 或城市绑定的所有对象 我们使用谷歌地图 API 预先计算了具有各自纬度和经度的对象并将其存储在数据库中 有时 这些对象在它们可以提供服务的特定服务范围 半径内提供服务 例如现在的情况就
  • 通过 HTML 将复杂变量传递给 javascript 的正确方法

    我试图摆脱使用 PHP 的 htmlentities 但我在这里停止了 但后来我想 我不做替换和检查特殊字符 而是只 JSON 整个对象 这提供了一个非常不受欢迎的结果 其中包含大量双引号 那么我应该怎么做呢 我应该为每个图像分配一个数字唯
  • 提交后如何重置表单?

    我有一个简单的表格 假设它需要一个电子邮件地址 提交表单后 消息堆栈会通知用户其地址已成功提交 问题是 提交地址后 带有电子邮件的表单字段仍然包含用户输入的电子邮件地址 我该如何重置该字段 我必须为此使用 JavaScript 吗 谢谢 w
  • CodeIgniter 3 - 在控制器中支持 API 和 Web 请求?

    我目前正在使用 CodeIgniter3 应用程序 并为标准的类似博客系统奠定了基础 该结构是标准 CI 用户请求页面 页面加载控制器方法 控制器方法从其模型调用任何相关的数据库函数 然后加载视图 不过 我还希望能够通过 API 访问此视图
  • 通过 PHP 脚本重新启动 Nginx

    我目前正在努力使我的 WordPress 插件与 nginx 兼容 该插件需要访问 conf文件在wp content uploads目录 以便它可以添加所需的规则 目前 它更新了 htaccess文件位于同一目录中 更改立即生效 无需干预
  • 如何准备更新查询语句? [复制]

    这个问题在这里已经有答案了 我有一个 mysqli 查询 代码如下 db usag gt query UPDATE Applicant SET phone number phone number street name street nam
  • PHP MCRYPT 加密/解密返回不可见的奇怪字符?

    mcrypt decrypt给了我额外的不可见字符 这些字符通过在页面上回显是不可见的 只能通过将其写入文本文件来查看 也就是说 只显示在页面上就可以了 而且很难被注意到 这是谷歌搜索的代码示例 请指导我正确的用法是什么 有什么问题吗 fu
  • PHP清晰度卷积矩阵

    我正在使用一个卷积矩阵 http www php net manual en function imageconvolution php为了锐度PHP GD我想改变清晰度 level 我会去哪里做出改变如果我想做到的话或多或少尖锐 imag
  • 在 Codeigniter 中显示来自连接的数据

    我正在使用简单的联接从两个数据库中提取数据 这是模型中的连接 function com control this gt db gt select this gt db gt from comments this gt db gt join
  • 参考指南:这个符号在PHP中是什么意思? (PHP 语法)

    这是什么 这是关于 PHP 语法时不时出现的问题的集合 这也是一个社区 Wiki 因此邀请每个人参与维护此列表 为什么是这样 过去很难找到有关运算符和其他语法标记的问题 主要思想是提供 Stack Overflow 上现有问题的链接 这样我
  • Paypal Rest API - 来自批准 URL 的令牌生命周期

    我使用 Paypal Rest API 我的问题是 有多长token来自批准 URL 有效吗 我想将此令牌 也包含我的令牌 存储到数据库并生成带有我的令牌的链接 稍后 如果我单击此链接 将我的令牌替换为 paypal 令牌 我想重定向到 p

随机推荐

  • 在android上模拟鼠标输入

    想象一下 我有一个从蓝牙设备接收坐标的服务 现在我想在鼠标光标移动时显示它 我设法使用 toolType TOOL TYPE MOUSE 发送 MotionEvents 但我没有在屏幕上显示本机 Android 鼠标光标 我发送的事件如下所
  • 在应用程序中使用 exoplayer 库播放 YouTube 视频

    我已经使用 exoplayer 库在我的应用程序中播放视频 但我无法使用 exoplayer 播放 youtube 视频链接 我遇到以下异常 ExoPlayerImplInternal 源错误 com google android exop
  • Android Min SDK Version 和 Max SDK Version 设置

    我有一个应用程序 只想安装在 ICS 上 所以我设置了最小和最大 sdk 版本如下
  • 为什么未定义的常量的计算结果为 true?

    愚蠢的问题 我很惊讶这个咬了我 为什么 PHP 中未定义的常量的计算结果为 true 测试用例 上面的示例打印 嗯 非常感谢你的帮助 Try defined WHATEVER THIS ISNT DEFINED 当 PHP 遇到未定义的常量
  • Google 电子表格以三个单元格为条件

    我一直在尝试在我的电子表格上实现一个条件 基本上是一个包含三个条件单元格的检查表 其中包含 是 或 否 我想要实现的所有目标 使用 onEdit 是所有三个单元格都包含 是 输入下一列以及输入最终 是 的日期 我已经设法创建了其他运行良好的
  • 通过 Javascript 从 API 下载 PDF

    我正在使用 vue js 并找到了一些如何实现这一点的好例子 目前我的 API 返回一个 test pdf snappy App make snappy pdf html h1 Bill h1 p You owe me money dude
  • Heroku 架构加载:数据库“postgres”用户的权限被拒绝

    我正在尝试将 Rails 应用程序部署到 Heroku 现在想要加载我的架构 我收到以下错误 Running bundle exec rake db schema load attached to terminal up run 1533
  • 如何告诉 Play Framework 2 和 Ebean 保存空字段?

    我正在使用 Play Framework 2 和 Ebean 当用户提交表单来编辑数据库中的现有对象时 它不会保存空值 我想这是为了防止用 null 覆盖表单中不存在的字段 但是 如果需要的话 我怎样才能让他们将表单中的字段设置为空呢 例如
  • 管道:错误的文件描述符

    我知道以前有人问过这类帖子 但他们的水平显然比我想象的要高 读完他们的帖子后我仍然不明白 所以我决定从这里再次发布这个问题 我正在学习使用管道进行多进程通信 我遇到了这个名为 错误文件描述符 的错误 我不明白为什么我的代码中会出现此错误 i
  • 文本索引 MongoDB,搜索字符串的最小长度

    我已经从 mongo shell 为集合 X 创建了一个文本索引 db X ensureIndex name text cusines text address city text 现在如果一个文档的 name 属性有一个值seasons
  • 响应式设计中的固定位置

    我正在使用响应式框架 1140px 在移动版本中 我必须修复徽标的位置 但不能使其与滚动内容重叠 基本上固定位置但不固定滚动图像 这可以实现吗 你想使用position absolute position fixed将元素固定在屏幕上 因此
  • java中通过HTTP Get下载文件

    我编写了一个下载 Servlet 以根据 messageID 参数返回文件 下面是 doGet 方法 Override protected void doGet HttpServletRequest request HttpServletR
  • 使用 Visual Basic 在 Windows 窗体中嵌入 DOS 控制台

    我设法从其他问题中找到一些数据 使我能够实现下一个代码 Imports System Runtime InteropServices Public Class Form1
  • 错误消息:“无法连接到 Gmail”

    有时我会从许多脚本的基于时间的触发器中收到此错误消息 我可以做些什么还是只是服务器端问题 这看起来确实像服务器端 但预计它偶尔会失败 我想你应该实施一个指数退避 http googleappsdeveloper blogspot com b
  • SQLite 数据库创建时自动增量附近的语法错误

    又是我 那个使用 SQLite net 的人 当我的表主键上没有自动增量时 我的代码可以正常工作 我想自动增量键 所以我像这样重建了表 using SQLite namespace VehicleTracks Models public c
  • Automapper 与 Dapper 的地图绘制对比

    这个问题是为了验证当前的实施在最佳实践和性能方面是否是正确的方法 到目前为止 在我之前的所有公司中 我一直在使用 Auto Mapper 将关系对象映射到域模型实体 并将域模型实体映射到 Dtos ORM 工具是实体框架 在我目前的公司中
  • 观看 OS 2 问题以设置图像

    我只想将图像添加到我的 WKInterfaceController 但是 Xcode 告诉我 在 Watch 上找不到名为 circle44 的图片 IBOutlet var cirlceImage WKInterfaceImage ove
  • JSON 模式:日期大于其他日期

    我有一个像这样的 json 模式 schema http json schema org draft 04 schema title Operation description The schema of an operation type
  • 如何管理故事板中的项目以添加展开/折叠 tableView 单元格的可能性

    我试图在我的 tableView 中创建通过单击展开和折叠各个单元格的能力 不考虑代码 我如何在情节提要中设置元素和约束 从某种意义上说 在我的单元格的内容视图中 我应该添加多少个 UIView 假设我想在展开单元格时将单元格的大小加倍 那
  • 使用 GD 调整图像大小和裁剪图像,同时保留纵横比

    我目前正在编写一个基于Uploadify 的上传器脚本 现在 我调整给定图像和水印的大小之一 这一切都运行良好 但我需要脚本来调整高度大小 然后裁剪宽度 以便长宽比不会混乱 到目前为止 这是我的代码 if fileExtension jpg