关于这个问题,网上提供的解决方法,都是说用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