PHP简单实现图片格式转换(jpg转png,gif转png等)


Posted in PHP onOctober 30, 2019

需求

开发过程中总会遇到一些需求需要对图片格式进行转换。比如 gif转png,jpg转png

如最近使用某平台的图片文件识别,居然不支持gif格式,那么就需要将gif处理成png等。

依赖

php扩展 gd 和 exif

实现

/**
 * 图片格式转换
 * @param string $image_path 文件路径或url
 * @param string $to_ext 待转格式,支持png,gif,jpeg,wbmp,webp,xbm
 * @param null|string $save_path 存储路径,null则返回二进制内容,string则返回true|false
 * @return boolean|string $save_path是null则返回二进制内容,是string则返回true|false
 * @throws Exception 
 * @author klinson <klinson@163.com>
 */
function transform_image($image_path, $to_ext = 'png', $save_path = null)
{
  if (! in_array($to_ext, ['png', 'gif', 'jpeg', 'wbmp', 'webp', 'xbm'])) {
    throw new \Exception('unsupport transform image to ' . $to_ext);
  }
  switch (exif_imagetype($image_path)) {
    case IMAGETYPE_GIF :
      $img = imagecreatefromgif($image_path);
      break;
    case IMAGETYPE_JPEG :
    case IMAGETYPE_JPEG2000:
      $img = imagecreatefromjpeg($image_path);
      break;
    case IMAGETYPE_PNG:
      $img = imagecreatefrompng($image_path);
      break;
    case IMAGETYPE_BMP:
    case IMAGETYPE_WBMP:
      $img = imagecreatefromwbmp($image_path);
      break;
    case IMAGETYPE_XBM:
      $img = imagecreatefromxbm($image_path);
      break;
    case IMAGETYPE_WEBP: //(从 PHP 7.1.0 开始支持)
      $img = imagecreatefromwebp($image_path);
      break;
    default :
      throw new \Exception('Invalid image type');
  }
  $function = 'image'.$to_ext;
  if ($save_path) {
    return $function($img, $save_path);
  } else {
    $tmp = __DIR__.'/'.uniqid().'.'.$to_ext;
    if ($function($img, $tmp)) {
      $content = file_get_contents($tmp);
      unlink($tmp);
      return $content;
    } else {
      unlink($tmp);
      throw new \Exception('the file '.$tmp.' can not write');
    }
  }
}

使用

// 转换后保存在test.png
transform_image($url, 'png', './test.png');
transform_image($filepath, 'png', './test.png');
// 转换后二进制结果直接返回
transform_image($url, 'png');
transform_image($filepath, 'png');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP之COOKIE支持详解
Sep 20 PHP
PHP中对于浮点型的数据需要用不同的方法解决
Mar 11 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
PHP面向对象精要总结
Nov 07 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
php实现三级级联下拉框
Apr 17 PHP
php解决DOM乱码的方法示例代码
Nov 20 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 PHP
PHP面向对象程序设计重载(overloading)操作详解
Jun 13 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
Aug 03 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 #PHP
PHP的HTTP客户端Guzzle简单使用方法分析
Oct 30 #PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 #PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
Oct 30 #PHP
微信小程序发送订阅消息的方法(php 为例)
Oct 30 #PHP
php上传后台无法收到数据解决方法
Oct 28 #PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 #PHP
You might like
php 删除记录实现代码
2009/03/12 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
javascript面向对象之对象的深入理解
2015/01/13 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
javascript实现文本框标签验证的实例代码
2018/10/14 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
python多线程同步之文件读写控制
2021/02/25 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
什么是servlet链?
2014/07/13 面试题
网络教育毕业生自我鉴定
2013/10/10 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers