PHP - 创建缩略图并保持纵横比

2023-11-24

编辑:这可以在 CSS 中轻松完成,在撰写本文时我对 CSS 不太了解

enter image description here

我使用 PHP 创建了一个缩略图创建器。生成的缩略图应具有相同的大小。但问题是使用上传具有不同纵横比的图像(例如横向或纵向)缩略图会变得难看。所以我创建了上面的图片来进行澄清。无论上传的图像是什么,它都会被放入一个矩形图像中。因此宽高比不会改变,缩略图的大小也相同。有人可以帮助我或告诉我一些想法吗?


define('THUMBNAIL_IMAGE_MAX_WIDTH', 150);
define('THUMBNAIL_IMAGE_MAX_HEIGHT', 150);

function generate_image_thumbnail($source_image_path, $thumbnail_image_path)
{
    list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path);
    switch ($source_image_type) {
        case IMAGETYPE_GIF:
            $source_gd_image = imagecreatefromgif($source_image_path);
            break;
        case IMAGETYPE_JPEG:
            $source_gd_image = imagecreatefromjpeg($source_image_path);
            break;
        case IMAGETYPE_PNG:
            $source_gd_image = imagecreatefrompng($source_image_path);
            break;
    }
    if ($source_gd_image === false) {
        return false;
    }
    $source_aspect_ratio = $source_image_width / $source_image_height;
    $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH / THUMBNAIL_IMAGE_MAX_HEIGHT;
    if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) {
        $thumbnail_image_width = $source_image_width;
        $thumbnail_image_height = $source_image_height;
    } elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) {
        $thumbnail_image_width = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio);
        $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT;
    } else {
        $thumbnail_image_width = THUMBNAIL_IMAGE_MAX_WIDTH;
        $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH / $source_aspect_ratio);
    }
    $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height);
    imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height);

    $img_disp = imagecreatetruecolor(THUMBNAIL_IMAGE_MAX_WIDTH,THUMBNAIL_IMAGE_MAX_WIDTH);
    $backcolor = imagecolorallocate($img_disp,0,0,0);
    imagefill($img_disp,0,0,$backcolor);

        imagecopy($img_disp, $thumbnail_gd_image, (imagesx($img_disp)/2)-(imagesx($thumbnail_gd_image)/2), (imagesy($img_disp)/2)-(imagesy($thumbnail_gd_image)/2), 0, 0, imagesx($thumbnail_gd_image), imagesy($thumbnail_gd_image));

    imagejpeg($img_disp, $thumbnail_image_path, 90);
    imagedestroy($source_gd_image);
    imagedestroy($thumbnail_gd_image);
    imagedestroy($img_disp);
    return true;
}

generate_image_thumbnail('original_image.jpg', 'thumb_image.jpg'); //call the function

使用该代码,您将得到类似的内容

enter image description here

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

PHP - 创建缩略图并保持纵横比 的相关文章

  • 如何通过 PHP 轻松转换 UTC 日期?

    我将日期存储在 MySQL 数据库中的 UTC 日期时间字段中 我正在使用 PHP 并且调用了 date timezone set UTC 以便对 date 不带时间戳 的所有调用都返回 UTC 格式的日期 然后我有了它 以便给定的网站可以
  • LinkedIn Groups API - 在单个 API 请求中获取多个群组的群组徽标

    Using LinkedIn 群组 API http developer linkedin com documents groups api 我正在显示用户在 LinkedIn 上所属的组列表 使用以下命令可以清楚地在一次调用中获取组列表
  • 阻止表单 POSTing,直到 javascript 代码得到满足

    每当我点击提交按钮时它就会触发alert empty username 但直接引导我去checklogin php 我怎样才能避免这种情况并让它保留在页面上 除非该字段不为空 function RequiredFields var user
  • 通过删除空 GET 变量并简化变量名称来缩短 URL

    我正在开发一个网站 在提交后组成一个 URLGET form 表单值作为一组变量传递 其中必须至少定义一个变量才能在数据库上进行搜索 我想将网址缩短为删除空表单元素并使其更加用户友好简化变量名称 目前 URL 如下所示 只是带有更多变量 我
  • {{ Auth::user()->name }} 如何在 Blade 文件中打印用户名?

    我一直在 laravel 中使用默认身份验证功能 我在一个刀片文件中发现 Auth user gt name 能够显示存储在用户表中的名称 但我想知道的是它是如何显示的用雄辩的口号在刀锋中呼唤名字 你可以像这样使用它 auth gt use
  • 如何从 PHP 输出 XML 字符串

    我正在获取一个 XML 字符串并在 PHP 中对其进行编辑 以便在访问 PHP 文件时最终输出编辑后的 XML 字符串 我一直在尝试使用 echo 和 print 来输出 XML 文档 但它只打印最里面标签内的数据 我希望它的功能就像直接加
  • PHP:将字符串分成 8 个块,我该怎么做?

    我基本上有二进制 假设它的长度是300 我如何将它分割 就像使用爆炸一样 成 8 位块 我查看了 chunk split 但它似乎只有一个 end 参数 而不是将其放入数组的选项 或者它可以插入数组吗 末尾 8 位数字可以低于 8 如果有人
  • 使用 fgetcsv 循环遍历 csv

    我有一个包含 3 列的 csv 文件 电子邮件地址 名 and 姓 我已经到了可以使用以下代码打印数组的阶段 这会打印数组 因此每个字段都在一行中 我希望它打印的只是该行第一列中的值 这是如何完成的 关于 fgetcsv 的文档对我 相对初
  • PHPUnit RabbitMQ:为创建连接函数编写测试

    我面临以下问题 我编写了一个函数 根据所需参数创建连接对象 AMQPConnection 现在我想编写相应的单元测试 我只是不知道在没有运行 RabbitMQ 代理的情况下如何做到这一点 这是有问题的函数 public function g
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • 如何修复网站 iframe 错误?

    当我访问此网址时 警告 推荐使用一些广告拦截器 网页链接加载良好 没有错误 但是 当我尝试通过加载同一页面时iframe在我的html代码中 出现错误 我的html代码
  • Zend 框架将字母“f”输出到我的页面上

    我已经下载了 Zend 框架稳定版本 我相信是 1 11 上传到我的服务器 并将其添加到我的 php 包含路径中 我的目标是使用 Feed 和 Feed Writer 模块来处理一些 RSS 和 Atom 的繁重工作 问题是 每当我包含 F
  • 覆盖默认标识符生成策略对关联没有影响

    交响乐 2 7 2 学说 ORM 2 4 7 MySQL 5 6 12 PHP 5 5 0 我有一个具有自定义 ID 生成器策略的实体 它工作完美 在某些情况下 我必须使用 手工制作 的 ID 来覆盖此策略 当主实体在没有关联的情况下被刷新
  • PHP 检查字符串是否只包含任何语言的字母、数字和空格

    我如何检查字符串是否只包含任何语言中的字母 数字和空格 我已经尝试过 但它不检查像 这样的特殊字符 preg match p L u string preg match p N u string 您可以使用 preg match p L p
  • Magento - 当我的订单取消或退款时如何运行代码

    如果订单被取消或退款 我的支付模块需要向支付服务发送通知 我假设订单页面 在管理后端 上的 取消 按钮将取消订单 而 贷项通知单 按钮 创建发票后 将退还订单 如何针对这些事件运行我的代码 我尝试在付款方式模型中使用 cancel 方法 但
  • Laravel 集成测试:如何断言一个 URL 已被调用但另一个 URL 没有

    我想测试一个向某个 URL 发出请求的控制器 例如 http example com api say hello 但它不会向另一个 URL 发出请求 例如 http example com api say bye bye 我想测试的控制器功
  • 显示表中的记录

    我的第一个 PHP 项目遇到了一些麻烦 我试图从 MySQL 数据库 有 3 条记录 获取数据并将其显示在表格中 问题是它似乎只显示记录 2 和 3 它跳过了第 1 条记录 请参阅我的代码并在下面显示 if mysqli connect e
  • 按通用值对值进行分组:userid 和 ipaddress

    我正在解决数据库中的一个问题 我正在尝试查找使用多个帐户的用户 我有一个用户 ID 和使用的 IP 地址的列表 如下所示 用户 ID IP 地址 1 IP 地址 13 2 IP 地址 23 1 IP 地址 12 4 IP地址56 9 IP
  • PHP - Filter_var 替代方案?

    我构建了一个 php 脚本来输出以表单形式发布的数据 但遇到了问题 网站将运行的服务器运行 PHP 5 1 6 此版本的 PHP 不支持 filter var 我需要知道短期内的替代方案 最好是昨天 但在 Google 或 Stack Ov
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t

随机推荐

  • 使用 abcPDF 将 HTML 转换为 PDF 时出现额外空白页

    我有一个 HTML 报告 每个打印页面都包含 div class page 页面类定义为 width 180mm height 250mm page break after always background position centre
  • 使用 JavaScript 确定从“div”顶部到窗口顶部的距离

    如何确定 div 顶部到当前屏幕顶部之间的距离 我只想要当前屏幕顶部的像素距离 而不是文档顶部的像素距离 我尝试过一些类似的事情 offset and offsetHeight 但我就是无法集中注意力 您可以使用 offset 获得与doc
  • 在匹配中使用计算值作为模式的惯用方法

    使用运行时计算的值作为匹配中的模式之一的最佳方法是什么 我有一个值 byte 我需要与其他值进行匹配 一些值是固定的 b 0 b 9 其他的在运行时计算 c some function 我当前的解决方案是使用一个假变量和一个 if 保护 即
  • JQuery 检测下拉值被选中,即使它没有改变

    使用 JQuery 或 JavaScript 我想检测用户何时选择一个值 即使他们没有更改已选择的值 如何才能做到这一点 我试过 MyID select function my function and MyID change functi
  • 架构设计 - 支持通过移动应用完成 Facebook 登录的 REST API

    我正在尝试设计 REST API 来支持各种移动客户端 iOS 和 Android 应用程序 这些应用程序将允许用户使用 Facebook 登录以及我们自己的电子邮件身份验证进行登录 你可以参考下图来了解我的设计 有两个级别的授权 第一个是
  • '\python.exe' 处没有 python

    不断出现 No Python at C Users python exe 错误 即使我删除了以前的 python 和路径 文件位置也是我安装以前的 python 的位置 我想在 VS code 中使用 python 在 Windows 10
  • iOS 中的应用程序购买收据验证 - 沙箱与生产 url?

    我跟着Ray Wenderlich 的教程在我的应用程序中实现收据验证 该代码直接从我的应用程序连接到 Apple 的验证服务器 而不是通过我自己的服务器 在我向 AppStore 提交第一个二进制文件后 我测试了我的应用程序 但应用程序内
  • 猫头鹰旋转木马无法正常工作,也许我链接的东西不正确?

    我尝试在我的新项目中使用猫头鹰旋转木马 我似乎对此有问题 到目前为止 只有 HTML 和 CSS 可以工作 我不知何故对脚本做了一些错误的事情 有人可以帮我看看并指出我搞砸的正确方向吗 这是该网站的链接 猫头鹰轮播位于网站底部附近 您将看到
  • Java:(new Random()).nextInt(5)总是返回相同的数字吗?

    有时这段代码总是返回相同的数字 有时它工作得很好 new Random nextInt 5 我怀疑问题出在哪里 它可能总是使用相同的种子创建一个新的随机数 那么最好的解决方案是什么 为 Random 创建一个静态变量并 用它来代替 使用 M
  • AVD 管理器不会将我的 HTC Hero 手机检测为虚拟设备

    运行应用程序时 我需要使用手机作为模拟器 目标 虚拟设备 我已安装 HTC Sync 并且 USB 驱动程序正常 我已经在设置中启用了 USB 调试 我还需要做什么才能让 Eclipse AVD Manager 检测我的手机 我按照我现在所
  • 更新 SimpleCursorAdapter 同时保持 ListView 中的滚动位置

    我的问题 每当我通过其 自定义 SimpleCursorAdapter 更新其内容时 我的 ListView 都会将其滚动位置重置到顶部 我希望 ListView 在更新时保持其滚动位置 我首先每次创建一个新的适配器实例并使用ListVie
  • 如何在 JavaFX 控制器中使用 Guice?

    我有一个 JavaFX 应用程序 我想在其中引入 Guice 因为我的代码 现在工厂满了 只是为了测试的目的 我有一个用例 其中我有某个视图的控制器类 这个控制器类有一个视图模型 我通过以下方式将模型传递给视图模型 控制器类的构造函数 在控
  • 使用 Jenkins 在多个环境中按顺序运行作业任务

    我是詹金斯的新手 我正在尝试在单个作业中实现特定场景 以使用 Jenkins 构建移动应用程序 在一项工作中 我想依次启动多个任务 任务 1 Windows gt 任务 2 Windows gt 任务 3 Windows gt 任务 4 M
  • 如何防止数据网格中的行在应用程序运行时闪烁

    在我目前正在开发的应用程序中 我使用 datagridview 来显示数据 要填充它 我必须按一个按钮 后台工作程序将开始运行 它将填充数据表 当它完成运行时 它将使用数据表作为数据网格的数据源 这工作正常 用户界面保持响应等等 但现在我已
  • python 内存不足错误的解决方法有哪些?

    我正在将 x y z 点文件 LAS 读入 python 中 并遇到内存错误 我正在为我正在从事的项目在已知点之间插入未知点 我开始处理小文件 50 000 000 点 现在我的代码因内存错误而失败 处理如此大量的数据有哪些选择 我不必立即
  • 为模式匹配搜索索引 jsonb 数据

    这是以下内容的后续内容 jsonb 键 值的模式匹配 我有一张表如下 CREATE TABLE PreStage transaction transaction id serial NOT NULL transaction jsonb CO
  • 如何将 Map 编码为 Base64 字符串?

    我喜欢将 java 字符串映射编码为单个 Base 64 编码字符串 编码后的字符串将被传输到远程端点 并且可能被不怀好意的人操纵 因此 最糟糕的情况应该是无效的键 值元组 但不应带来任何其他安全风险 Example Map
  • 如何查看哪些插件导致 Vim 变慢?

    有没有办法分析 Vim 插件 当我打开一个大文件时 我的 MacVim 变得越来越慢 py 我知道我可以取消选择所有插件并逐一重新选择以检查哪个插件是罪魁祸首 但是有没有更快的方法 我的 dotvim 在这里 https github co
  • Firefox new Date() 从字符串构造本地时区的时间

    我正在尝试从字符串创建日期对象 我得到 ISO 格式的日期 除了毫秒部分 例如 2012 01 30T16 23 12 当我在 IE Chrome 和 Firefox 中运行以下代码时 结果有所不同 链接到小提琴 currentDate 2
  • PHP - 创建缩略图并保持纵横比

    编辑 这可以在 CSS 中轻松完成 在撰写本文时我对 CSS 不太了解 我使用 PHP 创建了一个缩略图创建器 生成的缩略图应具有相同的大小 但问题是使用上传具有不同纵横比的图像 例如横向或纵向 缩略图会变得难看 所以我创建了上面的图片来进