文章大纲

php压缩图片后,逆时针旋转了90度,exif_read_data读取没有Orientation数据,怎么解决

2022-10-14 10:10:41

关于这个问题,网上提供的解决方法,都是说用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程序压缩后图片方向转变了,而是图片读取出来的宽和高,本来就和实际的相反。


那Windows系统为何能正确识别图片的方向呢?

检查上面图片的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




我要评论
评论列表