为什么调整大小后的 PNG 图像比原始图像大很多?

2023-11-20

我很困惑为什么使用 GD 库调整大小的 PNG 图像比原始图像大得多。

这是我用来调整图像大小的代码:

// create image from posted file
$src = imagecreatefrompng($file['tmp_name']);
// get original size of uploaded image
list($width,$height) = getimagesize($file['tmp_name']);
if($width>$maxImgWidth) {
    // resize the image to maxImgWidth, maintain the original aspect ratio
    $newwidth = $maxImgWidth;
    $newheight=($height/$width)*$newwidth;
    $newImage=imagecreatetruecolor($newwidth,$newheight);

    // fill transparent with white
    /*$white=imagecolorallocate($newImage, 255, 255, 255); 
    imagefill($newImage, 0, 0, $white);*/

    // the following is to keep PNG's alpha channels
    // turn off transparency blending temporarily
    imagealphablending($newImage, false);
    // Fill the image with transparent color
    $color = imagecolorallocatealpha($newImage,255,255,255,127);
    imagefill($newImage, 0, 0, $color); 
    // restore transparency blending
    imagesavealpha($newImage, true);

    // do the image resizing by copying from the original into $newImage image
    imagecopyresampled($newImage,$src,0,0,0,0,$newwidth,$newheight,$width,$height);

    // write image to buffer and save in variable
    ob_start(); // Stdout --> buffer
    imagepng($newImage,NULL,5); // last parameter is compression 0-none 9-best (slow), see also http://www.php.net/manual/en/function.imagepng.php
    $newImageToSave = ob_get_contents(); // store stdout in $newImageToSave
    ob_end_clean(); // clear buffer
    // remove images from php buffer
    imagedestroy($src);
    imagedestroy($newImage);
    $resizedFlag = true;
}

然后我将 $newImageToSave 作为 blob 保存在 mysql 数据库中。

我尝试阻止 Alpha 通道并仅设置白色背景,文件大小没有显着变化。我尝试设置“压缩”参数(0到9),但仍然比原来的大。

Example
我拿了这个image(1058px*1296px) 并将其大小调整为 900px * 1102px。结果如下:

原始文件:328 KB
PNG (0):3,79 MB
PNG (5):564 KB
PNG (9):503 KB

任何有关如何使调整后的图像的文件大小更小的提示都值得赞赏。

--

PS:我认为它可能是位深度,但正如您所看到的,上面的示例图像有 32 位,而调整大小的图像是 24 位。


您不需要调用大多数函数来缩小图像,imagefill , imagealphablending等可能会导致更大的文件大小。

保持使用透明imagecreate代替imagecreatetruecolor只需做一个简单的调整大小

$file['tmp_name'] = "wiki.png";
$maxImgWidth = 900;
// create image from posted file
$src = imagecreatefrompng($file['tmp_name']);
// get original size of uploaded image
list($width, $height) = getimagesize($file['tmp_name']);
if ($width > $maxImgWidth) {
    $newwidth = $maxImgWidth;
    $newheight = ($height / $width) * $newwidth;
    $newImage = imagecreate($newwidth, $newheight);
    imagecopyresampled($newImage, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    imagepng($newImage, "wiki2.png", 5); 
    imagedestroy($src);
    imagedestroy($newImage);
    $resizedFlag = true;
}

最终大小:164KB

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

为什么调整大小后的 PNG 图像比原始图像大很多? 的相关文章

随机推荐

  • 如何将“wchar_t *”转换为“const char *”

    我怎样才能转换 wchar t to const char 使用C MFC VS2010 谢谢 由于问题是关于MFC的 我建议如下 CStringA a Test CStringW w L Test a CStringA w w CStri
  • ClassLoader 不提供“addTransformer(ClassFileTransformer)”方法

    我正在使用 Spring 和 AspectJ 进行一些不错的编织 插入后我刚刚遇到了这个问题
  • 阻止或取消退出 JavaFX 2

    当退出 JavaFX 程序时 我将重写 Application stop 以检查未保存的更改 这工作正常 但最好为用户提供取消操作的选项 换句话说 Application stop 是最后机会沙龙 虽然它确实捕获了退出 但撤销退出过程有点晚
  • 无法从 ondatachange 方法获取值

    我目前正在开发一个android应用程序 我使用firebase作为数据库 但是当我在onDataChange方法中获取变量并将它们分配给全局变量时 我得到了空变量 但是当我在onDataChange方法中调用这些变量时 它们是不为空 pu
  • 如何在 Typescript 中定义类数组(而不是实例)

    我正在尝试 Typescript 中的一些语言结构 我希望创建一个类数组 稍后将实例化这些类 如果我在上面尝试的话 我的代码似乎可以编译并且可以工作打字稿游乐场但它确实在打字稿框中给出了错误 Argument of type typeof
  • SQL地址数据很乱,如何在查询中清理它?

    我的地址数据存储在 SQL Server 2000 数据库中 我需要提取给定客户代码的所有地址 问题是 有很多拼写错误的地址 有些缺少部分等等 所以我需要以某种方式清理它 我需要剔除错误的拼写 缺失的部分等 并得出 平均 记录 例如 如果
  • Google 地图 - 在街景全景位置之间顺利切换

    我有一个简单的地图概念验证与maps google com类似 我在页面底部有一个带有街景 全景的滑块 当您单击图像时 您会看到相同的街景 当谷歌从一个街景转换到另一个街景时 如何实现与谷歌使用的相同类型的转换效果 它非常平滑 避免了我目前
  • 如何为 Azure App Insights 中的页面视图事件提供自定义名称?

    默认情况下 App Insights 使用页面标题作为事件名称 拥有动态页面名称 例如 Order 32424 会产生大量的事件类型 文档关于此事说要使用 trackEvent 方法 但没有示例 appInsights trackEvent
  • PHP 检查文件是否正在使用

    我想制作一个平面文件数据库 它将使用 php 文件来存储网站中的数据 我唯一的问题是 如果当我从平面文件数据库中 选择 某些内容 这意味着该文件被读取 时 如果在那一刻正在进行 更新 这意味着该文件被修改和写入 则该文件会空白 我丢失了所有
  • 以编程方式更改键盘布局

    我在瑞士公司环境中工作de CH作为标准键盘布局 同时使用de DE键盘 我可以手动将键盘设置更改为首选de DE 布局 将其设置为标准并分配快捷方式 但是 不知何故 我的设置在任意时间后消失 可能与管理员运行的更新有关 所以我必须每隔几天
  • sh shell 中的自解压脚本

    我将如何制作一个可以执行的自解压存档sh 我最接近的是 extract archive printf
  • 有使用 Android v2.0 的 PopupWindow 类的简单示例吗?

    我在网上查找 找不到 PopupWindow 类的工作示例 我在网上找到的代码示例要么编译但不起作用 要么使用已被删除的方法 例如Activity getViewInflate 有没有一个简单的working显示 PopupWindow 的
  • JSON 对象与 json.dump 之间的逗号分隔符

    我正在摆弄输出一个 json 文件 其中包含目录中文件的一些属性 我的问题是 当附加到文件时 每个对象之间没有分隔符 我可以在每个 f 后面添加一个逗号并删除最后一个 但这对我来说似乎是一个草率的工作 import os import os
  • 不使用 GetMethods 获取通用方法

    我想获取方法System Linq Queryable OrderyBy
  • 如何使用 NHibernate 和 Spring 为死锁配置 RetryAdvice 和 ExceptionTranslation

    我正在使用 Spring net 1 2 和 NHibernate 2 0 1 在我的项目中 我面临一些死锁问题 除了调整数据库以尽量减少死锁发生之外 我还想实现 Springs RetryAdvice 来处理这个问题 我找不到任何如何配置
  • 强制 Makefile 中先决条件的顺序

    我有一个第三方 makefile 并且我希望在首先构建另一个自定义目标 T2 之前不要构建其中一个目标 T1 通常 这可以通过使 T2 作为 T1 的先决条件来实现 但是 T1 在其规则之一中使用 因此 通过添加先决条件 我最终破坏了构建
  • 从导航堆栈中删除页面

    我有这个应用程序架构 List Page gt Detail Page gt ShareOnFacebook Page 用户选择一个Item in the List Page 用户可以点击也可以不点击Share按钮 如果他或她这样做 应用程
  • 在 Safari 中的 iframe 中设置第三方 cookie 的技术仍然有效吗?

    我正在尝试找到一种在 Safari 中的 iframe 中设置 cookie 的方法 Safari 有一项政策 不允许 iframe 设置 cookie 除非用户单击 iframe 中的某些内容 我已阅读 Stackoverflow 和其他
  • 区分 celery、kombu、PyAMQP 和 RabbitMQ/ironMQ

    我想将图像上传到 S3 服务器 但在上传之前我想生成 3 种不同大小的缩略图 并且我希望它在请求 响应周期之外完成 因此我使用 celery 我已阅读文档 这是我的理解 如果我错了 请纠正我 Celery 帮助您在请求响应周期之外管理任务队
  • 为什么调整大小后的 PNG 图像比原始图像大很多?

    我很困惑为什么使用 GD 库调整大小的 PNG 图像比原始图像大得多 这是我用来调整图像大小的代码 create image from posted file src imagecreatefrompng file tmp name get