imagick处理宽高值相反的问题(带旋转方向的图片)

最新ios开发者同事反馈,iPhone拍的图片(竖着拍)上传接口获取的宽高和实际的宽高正好相反。原本为2448×3264(通过mac 显示简介查看的尺寸)的图片,接口返回是 3264×2448。然后php本地测试getimagesize() 发现就是 3264×2448。

在chrome或火狐或者是safari 查看图片时看起来是竖图且标签显示为 2448×3264, 但是在ie 11 都显示的为横图,属性显示为3264×2448。

后来经过查询资料发现,图片的exif信息中有一项为orientation表示方向。ie不识别这个方向。可以理解为实际它应该是一个横图,只是方向旋转了90度。(因为肯定是想要视觉效果就是竖图)现在要想办法把它处理为一个 2448×3264 不带旋转的图片(效果和chrome等展示的一样),这样获取的宽高信息才算正确。(之前还尝试了 -strip把exif信息清理了,再用getimagesize获取还是3264×2448。)

Exif的Orientation信息说明:

http://blog.csdn.net/ouyangtianhan/article/details/29825885

已查到如果php用imagick的扩张:

可以用

$image = new Imagick(‘/data/wwwroot/zfabu_dev/test/IMG_5035.JPG’);

$image->getImageProperty(“exif:Orientation”);

输出结果为 6

网上有个地址 http://www.markdream.com/technologies/programs/php-get-the-picture-exif-info.shtml 比较详细的说明了php获取exif 信息。这里6表示 right side top

通过上面那个连接参考,拍照可能出现的数值也就是 1,3,6,8,1和3分别未0和180度,应该不会颠倒宽高,只需要处理是6和8的情况了。

因为应用服务器没有安装php imagick扩张,只能想办法用命令,问的官方论坛:

http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=27374

之前我在convert 参数页面搜索exif时看到了-auto-orient 这个命令。贴子里老外又正好回复了这个。

那现在我的解决方案是:判断图片的方向是为6或8时,使用-auto-orient 处理未正常的图片后再进行后续操作。

判断的命令是:

identify -format “%[orientation]” img_5035.jpg
RightTop

identify -format “%[EXIF:Orientation]” img_5035.jpg
6

或者

convert img_5035.jpg -format %[EXIF:Orientation] info:
6

ImageMagick 6.8.8-9 测试命令是有效的。服务器上ImageMagick 6.2.8 -auto-orient 处理了无效,后来升级到了最新版可以了。

[root@chenlong ~]# identify -format ‘%[exif:orientation]‘ img_5035.jpg

6[root@chenlong ~]# convert img_5035.jpg -auto-orient  img_5035_rotate.jpg

[root@chenlong ~]# identify -format ‘%[exif:orientation]‘ img_5035_rotate.jpg
1

[root@chenlong ~]# identify img_5035.jpg
img_5035.jpg JPEG 3264×2448 3264×2448+0+0 8-bit sRGB 2.406MB 0.000u 0:00.000

[root@chenlong ~]# identify img_5035_rotate.jpg
img_5035_rotate.jpg JPEG 2448×3264 2448×3264+0+0 8-bit sRGB 2.56MB 0.000u 0:00.009

再进行后续压缩操作。

imagick资料:

http://www.fmwconcepts.com/imagemagick/
http://www.rubblewebs.co.uk/imagemagick/ (php)

另外上篇涉及到设置透明问题,发现在php手册关于imagick的方法的用户评论部分有提到。

newImage()

christian dot reinecke at web dot de (23-Jun-2009 12:35)

The color value (3rd argument) for transparency is “none”.

setBackgroundColor()

eleg (28-Feb-2012 10:59)

Be cautious and set bgcolor BEFORE importing a SVG with transparency!  :-/

<?

$im = new Imagick();

$im->setBackgroundColor(new ImagickPixel(‘transparent’));

$im->readImage(‘carte_Alain2.svg’);

$im->setImageFormat(“png32″);

header(‘Content-type: image/png’);

echo $im;

关于 Administrator

爱拼才会赢!
此条目发表在 Php 分类目录,贴了 , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>