前言:
  因朋友的PHP小项目, 而去帮忙解决了一个小问题, 现在来总结概括一下.
  也不知道大家在使用和开发的过程中有没有遇到类似的场景, IPhone手机上传照片后, 发现图片方向颠倒了, 甚至各种姿势(90, 180, 270度旋转)都有, T_T.
  

php和nginx文章的相关列表:
  • nginx服务配置---php服务接入 
  • nginx+tomcat集群配置(1)---根目录设定和多后端分发配置 
  • nginx+tomcat集群配置(2)---静态和动态资源的分离
  • nginx+tomcat集群配置(3)---获取真实客户端IP
  • nginx+tomcat集群配置(4)--rewrite规则和多应用根目录设定思路

问题根源分析:
  人们在拍照过程中, 可能会横拍/竖拍, 其实图片的旋转是由拍摄角度而定的. 不过由于手机有重力感应, 可以智能地调整, 因此你所拍的照片, 在浏览中, 都是正面面向你的.
  Android/IOS都是如此, 只不过, 安卓手机, 会归一化, 其的Orientation永远为0, 而IOS则偷懒了, 其在图片头中, 设定了Orientation信息, 图片数据没有做旋转处理.
  因此在Iphone手机上传图片后, 要是没做任何处理, 就会出现开头那种情况, 图片颠倒了.

PHP的解决方案:
  关于这个问题, 网上有很多解决方案, 基本上都谈到了exif插件的处理方式.
  这是EXIF插件及函数接口的官方API文档
  当然这边, 需要特别申明一下: EXIF只支持JPEG, TIFF图片格式, 作者在这边不小心掉了坑, 好心痛.

  1. $source_file = "/path/to/xxx.jpeg";
  2. $dest_file = "/path/to/yyy.jpeg";
  3.  
  4. $data = imagecreatefromstring(file_get_contents($source_file));
  5. $exif = exif_read_data($source_file);
  6. // exif信息头, 包含了照片的基本信息, 包括拍摄时间, 颜色, 宽高, 方向
  7. if(!empty($exif['Orientation'])) {
  8.   switch($exif['Orientation']) {
  9.     case 8:
  10.       $data = imagerotate($data, 90, 0);
  11.       break;
  12.     case 3:
  13.       $data = imagerotate($data, 180, 0);
  14.       break;
  15.     case 6:
  16.       $data = imagerotate($data, -90, 0);
  17.       break;
  18.   }
  19.   imagejpeg($data, $dest_file);
  20. }

  这是最终的解决方案, 一点都没错, 不过要到达这步, 前面需要做不少的铺垫工作, 比如php的exif插件开启.

EXIF插件开启:
  一般PHP的插件开启, 还是比较简单的, 只要在php.ini做些简单的处理即可.
  最怕就是插件本身并没有安装, 这就需要额外的工作.
  本文的php为5.3.27版本, 但是exif扩展并不存在, 需要额外单独安装.
  参考了如下文章"WDCP管理面板安装启动EXIF、bcmath完整步骤". 
  1. 下载插件安装包

  1. wget http://soft.itbulu.com/wdcp/exif.zip ./

  2. 把exif解压后的包装包, 搁置在php主目录中

  3. 进行配置和安装

  1. /path/to/bin/phpize
  2. # 进入exif的目录
  3. ./configure --with-php-config=/path/to/php/bin/php-config
  4. make
  5. make install

  最终生成的exif.so, 文件在/path/to/php/extensions/no-debug-non-zts-xxxxxx/中.

  4. 配置php.ini
  去掉extension=exif.dll前面的';'.

  1. ;extension=exif.dll
  2. extension=/path/to/php/extensions/no-debug-non-zts-xxxxxx/exif.so

  去掉exif相关的选项前的';'.

  1. ;exif.encode_unicode = ISO-8859-15
  2. ;exif.decode_unicode_motorola = UCS-2BE
  3. ;exif.decode_unicode_intel = UCS-2LE
  4. ;exif.encode_jis =
  5. ;exif.decode_jis_motorola = JIS
  6. ;exif.decode_jis_intel = JIS

  当然这边, 需要注意的是, 需要同时开启扩展模块mbstring.dll, 并放在exif模块之前.
  当然可以如法炮制, 不过这边用了一个偷懒的方式, 操作系统为centos

  1. yum -y install php-mbstring

  然后定位下mbstring.so文件

  1. updatedb
  2. locate mbstring.so

  在php.ini配置添加mbstring的配置

  1. extension=/path/to/mbstring.so

php服务的重启:

  由于php在5.3版本后, 放弃了原有的php-fpm (start|restart|stop)这种命令模式, 因此重启的方式需要改变下.

  1. kill -USR2 <php-fpm pid>

  pid的查询, 可以借助ps命令, 也可以查找到pid文件, 这都是可行的办法.

结果:
  由于之前对php也半生不熟的, 因此前前后后也走了不少弯路, 所幸的事, 最终配置好环境, 走到最后的解决方案. 个人还是很庆幸的, 借助互利网, 站在巨人的肩膀上.

后记:
  当然, 实际在处理朋友的项目中, 没有那么一帆风顺, 中间还遇到了图片格式的问题, 就是开头提到的exif只支持jpeg和tiff格式的问题, 由于在页面前端做了些工作, 导致图片在前端转换为png格式, 同时又丢弃掉了Orientation信息, 因此修改后的方案也一直不成功, 郁闷, 甚至一度怀疑, 修改方案是否正确, ^_^.

个人站点&公众号:

  1. 个人微信公众号: 小木的智慧屋

  1. 个人游戏作品集站点(尚在建设中...): www.mmxfgame.com

IOS照片颠倒分析及PHP服务端的处理的更多相关文章

  1. IOS照片颠倒分析及移动/页面端的处理策略和思路

    前言: 前几天, 写了一篇关于IOS手机上传照片颠倒的技术分析文章: IOS照片颠倒分析及PHP服务端的处理. 不过其思路是从服务器来进行处理的, 这种做法相当普遍. 今天来讲述下, 如何从移动端/页 ...

  2. 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

    1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...

  3. IOS IAP APP内支付 Java服务端代码

    IOS IAP APP内支付 Java服务端代码   场景:作为后台需要为app提供服务,在ios中,app内进行支付购买时需要进行二次验证. 基础:可以参考上一篇转载的博文In-App Purcha ...

  4. java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码

    java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12: ...

  5. Fresco 源码分析(三) Fresco服务端处理(1) ImagePipeline为何物

    4.3 服务端的处理 备注: 因为是分析,而不是设计,所以很多知识我们类似于插叙的方式叙述,就是用到了哪个知识点,我们再提及相关的知识点,如果分析到了最后,我想想是不是应该将这个架构按照设计的方式,重 ...

  6. http2 技术整理 nginx 搭建 http2 wireshark 抓包分析 server push 服务端推送

    使用 nginx 搭建一个 http2 的站点,准备所需: 1,域名 .com .net 均可(国内域名需要 icp 备案) 2,云主机一个,可以自由的安装配置软件的服务器 3,https 证书 ht ...

  7. 【Netty源码分析】Netty服务端bind端口过程

    这一篇博客我们介绍一下Netty服务端绑定端口的过程,我们通过跟踪代码一直到NIO原生绑定端口的操作. 绑定端口操作 ChannelFuture future = serverBootstrap.bi ...

  8. Fresco 源码分析(三) Fresco服务端处理(2) Producer具体实现的内容

    我们以mProducerFactory.newNetworkFetchProducer()为例,因为这些创建新的producer的方式类似,区别在于是否有包装的处理器,即如果当前处理器中没有正在处理的 ...

  9. Fresco 源码分析(三) Fresco服务端处理(3) DataSource到Producer的适配器逻辑以及BitmapMemoryCacheProducer处理的逻辑

    4.3.1.2.1 Producer和DataSource之间适配器处理的逻辑 还是从程序的入口开始说吧 CloseableProducerToDataSourceAdapter.create() 源 ...

随机推荐

  1. callback res.end 记得return(Javascript需要养成的良好习惯)

    错误示例: app.get('do',function(req,res,next){ getUserId(function(err,userId){ if(err){ res.end(err);//错 ...

  2. Tomcat内存优化参数

    set JAVA_OPTS=-Xms512m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=128m -XX:MaxPermSize=128m 在catalina ...

  3. JQuery 判断不同浏览器

    if($.browser.msie) {          //IE浏览器alert("this is msie"); } else if($.browser.safari)   ...

  4. eclipse下的反编译

    Eclipse 安装反编译插件jadclipse(经验总结) 根据网上搜集的材料以及亲身安装测试,总结经验如下,希望能够帮助有需要的朋友们,本总结有助于朋友们少走弯路哦!jadclipse可以帮助查看 ...

  5. Vsftp精解之安装配置及原理(一)

    简介 Vsftp(Very Secure FTP)是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,是一款小巧而又易用FTP服务器程序,Vsftpd 在安全性.高性能及稳定性三个方面有很好 ...

  6. Java 基础知识相关好文章

    1. 使用简单易懂的例子,分析了equals 和 hashCode 两个方法的异同,尤其中自定义类中对他们的重写,对Set等容器类的在插入时的判断是否相等的影响. http://blog.csdn.n ...

  7. ubuntu13.04下建立嵌入式开发平台

    linux下建立嵌入式交叉开发平台,需要三个基本部分:编辑工具.交叉工具链以及平台相关库. 一.编辑工具: 一般Linux系统本身都带有编辑工具,比如VI.VIM.gedit等.这里记录的是第三方编辑 ...

  8. A Brief Review of Supervised Learning

    There are a number of algorithms that are typically used for system identification, adaptive control ...

  9. Tapestry

    Tapestry1)概述:Tapestry 是一个全面web application 框架,是使用JAVA 写的.Tapestry 不是一个application server,Tapestry 是一 ...

  10. SQL SERVER 2008 r2安装失败之Integration Service

    因工作需要,遂把以前的2008升级到r2,升级失败,具体原因忘了,卸载2008,清了注册表删了文件,结果安装的时候失败了,如下图: 下一步-有错误日志和错误的序列号,错误日志在C:\Program F ...