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图片格式, 作者在这边不小心掉了坑, 好心痛.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $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. 下载插件安装包
1 | wget http: //soft.itbulu.com/wdcp/exif.zip ./ |
2. 把exif解压后的包装包, 搁置在php主目录中
3. 进行配置和安装
1 2 3 4 5 | /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前面的';'.
1 2 | ;extension=exif.dll extension=/path/to/php/extensions/no-debug-non-zts-xxxxxx/exif.so |
去掉exif相关的选项前的';'.
1 2 3 4 5 6 | ;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
1 | yum -y install php-mbstring |
然后定位下mbstring.so文件
1 2 | updatedb 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信息, 因此修改后的方案也一直不成功, 郁闷, 甚至一度怀疑, 修改方案是否正确, ^_^.
个人站点&公众号:
个人微信公众号: 小木的智慧屋
个人游戏作品集站点(尚在建设中...): www.mmxfgame.com
posted on 2016-05-24 16:26 mumuxinfei 阅读(2069) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构