最近有一个项目需要将图片转成pdf,在测试中发现部分图片在pdf中显示是旋转的,打断点发现使用php函数getimageSize获取图片的宽高发现这个图片也是旋转过的,不过使用系统自带的看图软件查看图片却是正的,这就引起了我的兴趣。
getimageSize
首先说一说getimageSize这个函数,getimageSize可以获取图片的宽、高、图片类型等基本数据,直接传入图片的文件地址或者url即可
//$img传入图片地址
$imgInfo = getimagesize($img);
var_dump($imgInfo);
我们会得到如下一个数组
array(7) {
[0]=>
int(4032)
[1]=>
int(3024)
[2]=>
int(2)
[3]=>
string(26) "width="4032" height="3024""
["bits"]=>
int(8)
["channels"]=>
int(3)
["mime"]=>
string(10) "image/jpeg"
}
其中
- 索引 0 包含图像宽度的像素值
- 索引 1 包含图像高度的像素值。
- 索引 2 是图像类型的标记:1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 =
TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 =
JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM。这些标记与 PHP
4.3.0 新加的 IMAGETYPE 常量对应。 - 索引 3 是文本字符串,内容为“height=“yyy” width=“xxx””,可直接用于 IMG 标记。
- 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
- 索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如:
header(“Content-type: image/jpeg”);
从宽高上看这一个宽大于高的图片,矮胖型,但是实际上这个图片却是瘦高型的,查阅资料发现图片确实是一个矮胖,不过却有一个属性在捣乱,这就是EXIF
EXIF
可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。也就是说除了图片的基本属性之外,针对JPEG、TIFF、RIFF等格式图片还会有EXIF描述属性,也就是导致图片被莫名其妙的旋转了的真凶。
进入 EXIF解析 提交图片
我们发现了该图片包含的各种详细信息,其中有个信息就是图片被旋转了90度,发现了问题接下来就要想办法把它正过来。
exif_read_data
我们可以使用php函数exif_read_data来进行图片EXIF信息的读取,不过次扩展需要重新编译php,网上有很多办法,这里不再赘述。笔者使用的是公司开发框架下的php,编译起来较为麻烦,所以找了一种直接可以解析图片EXIF信息的工具
jhead
从 https://www.sentex.ca/~mwandel/jhead/ 下载软件,解压后直接执行make进行编译。
命令行执行
./jhead img.jpg
即可获取图片信息,除此之外jhead还提供了 -autorot 选项直接将图片进行翻转
./jhead -autorot img.jpg