我編寫了一個腳本,可以在本地批量調整上傳的圖像大小並創建縮圖。問題是,如果某些影像是垂直方向的,但調整大小後它們會水平旋轉。
這是由於影像的 exif 方向造成的。有沒有簡單的方法可以透過 PHP 從影像中刪除方向 exif?我知道 Imagick 可以完成,但我不能/不想安裝它。
沒有它還有什麼解決方案嗎?
現在我正在透過在圖像編輯器中打開這樣的圖像並重新保存它而不保留 exif 資訊來解決這個問題。之後,當我在腳本中調整此類圖像的大小時,結果是正確的。
所以我只想在調整大小之前從 PHP 腳本中的圖片中刪除 exif。
我嘗試了一個檢查方向 exif 的函數:
function removeExif($filename) { if (function_exists('exif_read_data')) { $exif = exif_read_data($filename); if($exif && isset($exif['Orientation'])) { $orientation = $exif['Orientation']; if($orientation != 1){ // $img = new Imagick($filename); // $img->stripImage(); // $img->writeImage($filename); } } } }
所以我只需要用其他東西替換 Imagick 部分,而不安裝任何額外的庫,也許使用已經包含的 GD 或其他東西。
P粉5692054782024-03-28 00:52:35
好吧,所以我決定旋轉圖像而不是刪除 exif,結果具有相同的效果。因此,我檢查 exif 方向值(如果有)是多少,然後根據該值,我只需使用 imagerotate,然後調整圖像大小。結果是完美的,不需要額外的安裝和庫。
function checkExif($filename) { if (function_exists('exif_read_data')) { $exif = exif_read_data($filename); if($exif && isset($exif['Orientation'])) { $orientation = $exif['Orientation']; if ($exif['Orientation']==3 OR $exif['Orientation']==6 OR $exif['Orientation']==8) { $imageResource = imagecreatefromjpeg($filename); switch ($exif['Orientation']) { case 3: $image = imagerotate($imageResource, 180, 0); break; case 6: $image = imagerotate($imageResource, -90, 0); break; case 8: $image = imagerotate($imageResource, 90, 0); break; } imagejpeg($image, $filename); imagedestroy($imageResource); imagedestroy($image); } } } }