IOS照片颠倒分析及PHP服务端的处理

前言:
  因朋友的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图片格式, 作者在这边不小心掉了坑, 好心痛.

$source_file = "/path/to/xxx.jpeg";
$dest_file = "/path/to/yyy.jpeg";

$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);
}

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

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

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

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

  3. 进行配置和安装

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

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

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

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

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

;exif.encode_unicode = ISO-8859-15
;exif.decode_unicode_motorola = UCS-2BE
;exif.decode_unicode_intel = UCS-2LE
;exif.encode_jis =
;exif.decode_jis_motorola = JIS
;exif.decode_jis_intel = JIS

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

yum -y install php-mbstring

  然后定位下mbstring.so文件

updatedb
locate mbstring.so

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

extension=/path/to/mbstring.so

php服务的重启:

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

kill -USR2 <php-fpm pid>

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

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

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

个人站点&公众号:

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

    个人游戏作品集站点(尚在建设中...): www.mmxfgame.com
时间: 2024-10-26 14:22:46

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

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

前言: 前几天, 写了一篇关于IOS手机上传照片颠倒的技术分析文章: IOS照片颠倒分析及PHP服务端的处理. 不过其思路是从服务器来进行处理的, 这种做法相当普遍. 今天来讲述下, 如何从移动端/页面端, 来解决这个问题, 侧重于讲讲思路. 意义: 但移动互联网有它独特的背景, 至今降耗电和省流量, 是很多移动端产品孜孜努力的方向. 再者移动端手机的照片大小, 普遍较大, 因此直接往服务器传, 往往会消耗很多流量, 在弱网环境下, 用户等待的时间也长, 时常会失败, 体验非常不好. 因此移动端

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

IOS IAP APP内支付 Java服务端代码 场景:作为后台需要为app提供服务,在ios中,app内进行支付购买时需要进行二次验证. 基础:可以参考上一篇转载的博文In-App Purchase(iap)快速指南了解原理. 直接先上服务端测试通过的代码: import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.U

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

java.net.SocketException:Software caused connection abort: recv failed 异常分析 分类: 很多的技术 2012-01-04 12:54 8004人阅读 评论(6) 收藏 举报 socket服务器bufferstring网络java 第 1个异常是java.net.BindException:Address already in use: JVM_Bind.该异常发生在服务器端进行new ServerSocket(port)(p

恩布企业 IM iOS 客户端 0.9.6,服务端 1.11 发布

恩布企业IM,免费企业即时通讯,企业内部通讯平台,iOS苹果开源手机客户端EntboostChat发布0.9.6版本,同时服务更新至1.11版本; iOS苹果手机端主要更新内容: 优化个人默认头像图标显示逻辑 修复聊天会话界面记录重复问题 支持群组聊天会话成员在线状态 优化联系人界面:增加查看用户.群组属性界面 管理临时讨论组,管理成员功能 管理个人群组,管理成员功能 增加好友/个人通讯录管理功能 增加动态消息通知功能 服务端主要更新内容: 恩布IM管理中心增加企业组织结构管理:公司列表,群组列

恩布企业 IM iOS 客户端 0.9.7,服务端1.13发布

恩布企业IM,免费企业即时通讯,企业内部通讯平台,iOS苹果开源手机客户端EntboostChat发布0.9.7版本,同时服务更新至1.13版本; iOS苹果手机端主要更新内容: 增加IOS手机文件收发功能 增加网络通讯加密,确保信息安全 个人及聊天头像显示优化 修正已知BUG及其他界面优化 服务端主要更新内容: 管理中心后台系统配置增加重置管理员密码,重置所有帐号密码等功能: 使用RSA.AES等通讯加密算法,确保信息安全:增加恩布IM管理员密码修改程序(ebpwdmgr.exe): 增加相同

用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM——Android端消息处理机制

NhmFramework Android端的消息处理机制原理 1.概要表述:在我们的框架中,Android客户端通过继承Application来控制整个应用程序的生命周期,在Application onCreate()方法中,我们将启动一个MainService,这个Service将负责Activity的异步消息处理(包括异步Http请求).任务调度.数据共享等大部分持久化操作.那么这样做的目的何在呢? 1)异步消息处理:在Service中实现异步消息处理是为了将Activity的界面显示的操作

原理剖析-Netty之服务端启动工作原理分析(下)

一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分析Netty的源码版本为:netty-netty-4.1.22.Final: 二.三.四章节请看上一章节 四.源码分析Netty服务端启动 上一章节,我们主要分析了一下线程管理组对象是如何被实例化的,并且还了解到了每个线程管理组都有一个子线程数组来处理任务: 那么接下来我们就直接从4.6开始分析了:

Netty源码分析第1章(Netty启动流程)--------&gt;第1节: 服务端初始化

第一章:  Server启动流程 概述: 本章主要讲解server启动的关键步骤, 读者只需要了解server启动的大概逻辑, 知道关键的步骤在哪个类执行即可, 并不需要了解每一步的运作机制, 之后会对每个模块进行深度分析 第一节:服务端初始化 首先看下在我们用户代码中netty的使用最简单的一个demo: EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventL

JavaScript(React Native、Node.js等)移动、服务端通吃的全栈语言

作者:李宁老师 东北大学计算机专业硕士.曾任沈阳东软股份项目经理.51CTO学院签约讲师.从事软件研究和开发超过20年.长久以来一直从事Java.Android.iOS.C++.Swift.Objective-C以及跨平台游戏引擎(Cocos2d-x.Unity3D等)的开发和技术指导工作.对国内外相关领域的技术.理论和实践有很深的理解和研究. 主要著作包括<Cocos2d-x实战游戏开发指南>(即将出版).<Swift权威指南>.<Android深度探索 卷1和卷2>