Imagick和GD图片处理旋转等问题

时间:2022-10-24 00:04:22

最近有幸接触Discuz二次开发,所有也在看它的相关源码。这几天遇到图片上传倒转的问题,花了不少时间解决。吐槽一下,这个问题对刚接触Discuz的新手来说有点恶心。也有部分原因,自己对图片处理这块业务几乎没什么接触。在这里记录一下自己这几天的收获

问题: IOS照片颠倒,自己在本地电脑翻转,上传图片并没有什么效果


1. 源码追踪

填坑历程: 项目中Discuz我们用的是自己的一套模板,所以前台跟真正的discuz不一样。这边用的是wfupload,一套基于flash的上传插件,以前用过基于h5的bootstrap file_input,不过这不影响后台的处理。自己找到对应模板下的js中的upload_url,自动跟踪到class_image类中,代码逻辑流程是先调用init方法 在调用Thumb方法,如下图

Imagick和GD图片处理旋转等问题

上图中的$this->params$_G['setting']的值,稍后介绍怎么让$this->libmethod为真的

Imagick和GD图片处理旋转等问题

从上图可以出来,$this->libmethod决定走的是哪个方法处理处理。处理图片有两种方式,一个是GD以及IM,这是从代码辛苦看出来的,当时本地一直走GD没走IM,线上走的IM,线上调试半天,才知道。最终代码通过日志找到了,这个决定走的GD还是IM的路径是从哪设置的。其实是在管理后台设置的,如下图

Imagick和GD图片处理旋转等问题

两种处理方式说明

GD方式:Discuz采用的是`imagecreatetruecolor` 、`imagecopyresampled`、`imagecreatefromjpeg`、`imagejpeg`等php函数处理,具体搜索引擎走一遍就知道

IM方式:我自己项目中Discuz采用的是imagick的convert命令行,组合好命令字符串,调用exec,实际上我看了一下,源码是调用php的imagick扩展,可能被前人改造了吧!

处理图片旋转的方式不难,但是网上比较少,不过有幸被我找到了,代码理解还比较容易。代码如下

$source_file = "d:/test.jpg";
$dest_file = "d:/haha.jpg";

$data = imagecreatefromstring(file_get_contents($source_file));
$exif = exif_read_data($source_file);
// exif信息头, 包含了照片的基本信息, 包括拍摄时间, 颜色, 宽高, 方向
if(!empty($exif['Orientation'])) {
  switch($exif['Orientation']) {
    case 8:
      $data = imagerotate($data, 90, 0);
      break;
    case 3:
      $data = imagerotate($data, 180, 0);
      break;
    case 6:
      $data = imagerotate($data, -90, 0);
      break;
  }
  imagejpeg($data, $dest_file);
}

这里我们只需知道图片有没有倒转,所以采用部分代码就行。

GD处理,我截图说明下

Imagick和GD图片处理旋转等问题

IM处理,因为我们这边改成命令了,所以在这不截图了。我们版本用的是6.9.5,采用的是convert命令,这块坑死我好久了,自己下载了7.0版本,发现根本没convert命令,因为新版本用来magick convert。记得装好运行convert -version测试imagick是否装好,这里指的是6.9.5版本的。下面列出旋转命令,具体旋转可以根据上面代码判断倒转角度,对应旋转多少度

convert -rotate 90 d:/test.jpg  d:/aa.jpg
convert -rotate 180 d:/test.jpg  d:/aa.jpg
convert -rotate -90 d:/test.jpg  d:/aa.jpg

2.Imagick的软件和php扩展安装的问题

找了好多资料,很多卵用都没有。最终还是php官方这个给力啊!参考时间最近的回答,在这里随便记录下,下载扩展一定要对应自己的php环境,phpinfo()中的要看的参数如下图中的红框

Imagick和GD图片处理旋转等问题

安装成功以后的phpinfo。

Imagick和GD图片处理旋转等问题

扩展安装教程:http://php.net/manual/en/imagick.setup.php
扩展下载:http://pecl.php.net/package/imagick/3.4.1/windows
imagick软件安装我下的是windows:https://www.imagemagick.org/download/binaries/
linux下的 http://www.imagemagick.org/script/binary-releases.php

注:1.软件版本选择,看官方说明吧。这里不说了。这里还提一下7.0的没用convert命令,坑死我了!
2.在cmd下运行php-m如果报找不到php_imgick.dll,把下载的扩展压缩包中*.dll 全扔到C:\Sysyem\System32\下
3.web扩展不好使的话,把下载的扩展压缩包中*.dll 全扔到/Path/to/Apache/bin/下,这个在扩展安装链接里面说了