关于这个问题,网上提供的解决方法,都是说用exif_read_data这个方法,给出的代码大致如下:
$exif = exif_read_data($srcPath);
if(isset($exif['Orientation']) ){
if($exif['Orientation'] == 6){
$this->imgTurn($filePath,$filePath); //顺时针旋转90度
}elseif($exif['Orientation'] == 8){
$this->imgTurn($filePath,$filePath,2); //逆时针旋转90度
}
}
可是我用exif_read_data读取我这次遇到问题的图片,数据里根本就没有Orientation这一项数据:
array (size=26)
'FileName' => string '2a79402924145047538fecea2520a4a2.jpg' (length=36)
'FileDateTime' => int 1665304829
'FileSize' => int 1262267
'FileType' => int 2
'MimeType' => string 'image/jpeg' (length=10)
'SectionsFound' => string 'ANY_TAG, IFD0, EXIF, INTEROP' (length=28)
'COMPUTED' =>
array (size=6)
'html' => string 'width="4032" height="3024"' (length=26)
'Height' => int 3024
'Width' => int 4032
'IsColor' => int 1
'ByteOrderMotorola' => int 1
'ApertureFNumber' => string 'f/1.8' (length=5)
'YResolution' => string '72/1' (length=4)
'XResolution' => string '72/1' (length=4)
'ImageWidth' => int 4032
'ImageLength' => int 3024
'YCbCrPositioning' => int 1
'ApertureValue' => string '169/100' (length=7)
'SceneType' => string '' (length=1)
'ExifVersion' => string '0220' (length=4)
'ExposureBiasValue' => string '0/6' (length=3)
'ExposureProgram' => int 2
'ColorSpace' => int 1
'MaxApertureValue' => string '169/100' (length=7)
'ExifImageLength' => int 3024
'BrightnessValue' => string '6/100' (length=5)
'DateTimeOriginal' => string '2022:10:09 16:09:32' (length=19)
'FlashPixVersion' => string '0100' (length=4)
'SubSecTimeOriginal' => string '577249' (length=6)
'WhiteBalance' => int 0
'InterOperabilityIndex' => string 'R98' (length=3)
exif_read_data() 函数从一个图片文件中读取 EXIF 头信息,这样就可以读取数码相机产生的元数据。
网上提到的大多是iphone拍摄的图片,而我这次的图片是用户用小米手机拍摄的。来源不同,所以这个exif头部信息也自然有所不同。
先看下图:

右边是我此次读取的实物图,对比图片提示信息和exif_read_data函数读取的数据,可以看出宽、高正好是互换的。
图片提示里:宽度是3024
exif_read_data函数读取的数据里:高度是3024
所以不是php程序压缩后图片方向转变了,而是图片读取出来的宽和高,本来就和实际的相反。
检查上面图片的exif头部数据,我发现还有ExifImageLength这个字段。
SELECT el.equipment_gage_name, eu.rate,
SUBSTRING(eu.month,6,2) as month_index, tteam.test_team
FROM tms_equip_utilization eu
LEFT JOIN tms_equipment_list el ON eu.equipment_gage_id=el.equipment_gage_id
LEFT JOIN tms_section_location sl ON sl.id= el.sl_id
LEFT JOIN tms_test_team tteam ON el.test_team_id = tteam.id
WHERE SUBSTRING(eu.month,1,4) = 2022 AND eu.type=0 AND eu.rate is not null AND eu.rate != 0
AND tteam.id IN (23,24) AND sl.id = 17 AND SUBSTRING(eu.month,6,2)=11 ORDER BY eu.month desc