博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS照片颠倒分析及PHP服务端的处理
阅读量:5889 次
发布时间:2019-06-19

本文共 2530 字,大约阅读时间需要 8 分钟。

 

前言:

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

php和nginx文章的相关列表:

  •  
  •  
  • 
  • 
  •  

问题根源分析:

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

PHP的解决方案:

  关于这个问题, 网上有很多解决方案, 基本上都谈到了exif插件的处理方式.
  这是EXIF插件及函数接口的. 
  当然这边, 需要特别申明一下: 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扩展并不存在, 需要额外单独安装.
  参考了如下文章"". 
  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-configmakemake install

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

  4. 配置php.ini

  去掉extension=exif.dll前面的';'.

;extension=exif.dllextension=/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文件

updatedblocate mbstring.so

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

extension=/path/to/mbstring.so

php服务的重启:

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

kill -USR2 

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

结果:

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

后记:

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

 

个人站点&公众号:

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

个人(尚在建设中...):

转载地址:http://icfsx.baihongyu.com/

你可能感兴趣的文章
linux 命令 —— gzip
查看>>
IDEA
查看>>
SecureCRT中用vbs脚本批量执行unix命令
查看>>
.NET中的泛型和Java泛型中的类型擦除
查看>>
时间:2014年4月13日14:32:08 加入购物车
查看>>
数据存储的四种常见方式
查看>>
WebStorm常用设置和常用快捷键
查看>>
Eclipse设置软tab(用4个空格字符代替)
查看>>
oracle创建监听Oracle Net Services 配置失败。退出代码是1
查看>>
01 VMware Workstation 12 + Red Hat Enterprise Linux 7.2-x86-64-bit 安装
查看>>
IOS7原生API进行二维码条形码的扫描
查看>>
Html5添加实用的多层图片视觉差互动特效插件教程
查看>>
在linux上布置JDK
查看>>
配置nagios遇到的错误
查看>>
Xcode8下快速集成极光推送并兼顾iOS10
查看>>
IT公司一个资深的面试官的面试心得
查看>>
java线程状态迁移 - <图解java多线程设计模式> 笔记
查看>>
Cisco-CCNA实验笔记
查看>>
wpf 辅助线程与窗体线程交互数据与webservice服务的异步调用
查看>>
saltstack模式匹配
查看>>