php - 上传后图像方向问题
问题描述
我有用于上传、调整大小和水印照片的 php 代码。一切正常,除非照片是从某些移动设备上传的,然后照片的方向错误(照片旋转了 90°)我找到了一些解决方案(如何检查/修复图像旋转之前使用 PHP 上传图片)但我无法在我的代码中实现它,因为我不知道足够的 php.ini 文件。我相信我需要在设置水印之前进行方向校正。这是没有方向校正的代码:
<?php
if(isset($_FILES['image'])){
$errors= array();
foreach($_FILES['image']['tmp_name'] as $key => $tmp_name ){
$file_name =$_FILES['image']['name'][$key];
$file_size =$_FILES['image']['size'][$key];
$file_tmp =$_FILES['image']['tmp_name'][$key];
$file_type=$_FILES['image']['type'][$key];
// Remove encoding problem
$file_name = Normalizer::normalize($file_name);
setlocale(LC_ALL,'bs_BA.UTF-8');
// get file extension
$fileType = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
$temp = pathinfo($file_name, PATHINFO_EXTENSION);
$name = str_replace($temp, '', $file_name);
// get filename without extension
$fileNewName = pathinfo($name, PATHINFO_FILENAME);
$watermarkImagePath = 'watermark.png';
$folderPath = "upload/";
$sourceProperties = getimagesize($file_tmp);
$imageType = $sourceProperties[2];
// Resize code
switch ($imageType) {
case IMAGETYPE_PNG:
$imageResourceId = imagecreatefrompng($file_tmp);
$targetLayer = imageResize($imageResourceId,$sourceProperties[0],$sourceProperties[1]);
imagepng($targetLayer,$folderPath. $fileNewName. ".jpg");
break;
case IMAGETYPE_GIF:
$imageResourceId = imagecreatefromgif($file_tmp);
$targetLayer = imageResize($imageResourceId,$sourceProperties[0],$sourceProperties[1]);
imagegif($targetLayer,$folderPath. $fileNewName. ".jpg");
break;
case IMAGETYPE_JPEG:
$imageResourceId = imagecreatefromjpeg($file_tmp);
$targetLayer = imageResize($imageResourceId,$sourceProperties[0],$sourceProperties[1]);
imagejpeg($targetLayer,$folderPath. $fileNewName. ".jpg");
break;
default:
echo "Invalid Image type.";
exit;
break;
}
// watermark code
$NewFile=$fileNewName.'.jpg';
$targetFilePath = $folderPath . $NewFile;
$watermarkImg = imagecreatefrompng($watermarkImagePath);
if(preg_match('/[.](jpg)$/i', $NewFile)) {
$im = imagecreatefromjpeg($targetFilePath);
} else if (preg_match('/[.](jpeg)$/i', $NewFile)) {
$im = imagecreatefromjpeg($targetFilePath);
} else if (preg_match('/[.](png)$/i', $NewFile)) {
$im = imagecreatefrompng($targetFilePath);
} else if (preg_match('/[.](gif)$/i', $NewFile)) {
$im = imagecreatefromgif($targetFilePath);
}
$marge_right = 1;
$marge_bottom = 1;
$sx = imagesx($watermarkImg);
$sy = imagesy($watermarkImg);
imagecopy($im, $watermarkImg, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($watermarkImg), imagesy($watermarkImg));
imagejpeg($im, $targetFilePath,70);
imagedestroy($im);
}
echo ' Successful upload';
}
function imageResize($imageResourceId,$width,$height) {
if($width > $height){
$targetWidth=1000;
$targetHeight=($height/$width)*$targetWidth;
} else {
$targetHeight=1000;
$targetWidth=($width/$height)*$targetHeight;}
$targetLayer=imagecreatetruecolor($targetWidth,$targetHeight);
imagecopyresampled($targetLayer,$imageResourceId,0,0,0,0,$targetWidth,$targetHeight, $width,$height);
return $targetLayer;
}
?>
<div class="sender">
<form action="" method="POST" enctype="multipart/form-data">
<input type="file" name="image[]" multiple/>
<input type="submit" value="Send"/>
</form></div>
解决方案
这是由于照片中的可交换信息。大多数从 iPhone 或 DSLR 拍摄的照片都有 exif 数据。
<?php
$image = imagecreatefromstring(file_get_contents($_FILES['image_upload']['tmp_name']));
$exif = exif_read_data($_FILES['image_upload']['tmp_name']);
if(!empty($exif['Orientation'])) {
switch($exif['Orientation']) {
case 8:
$image = imagerotate($image,90,0);
break;
case 3:
$image = imagerotate($image,180,0);
break;
case 6:
$image = imagerotate($image,-90,0);
break;
}
}
// $image now contains a resource with the image oriented correctly
?>
以上是修复旋转的代码
请参阅此以获取更多信息 https://www.php.net/manual/en/function.exif-read-data.php
推荐阅读
- image - Firebase 存储的图像链接返回 null - Flutter
- python - Tkinter gui 仅在调整窗口大小时绘制图形
- r - R中的语法问题
- javascript - 如何在 TypeScript/Angular 中测试类型?
- azure-devops - yaml 发布管道的触发器
- java - 0 在 Hikari CP 中连接重置后的活动连接
- python - Python holtwinter: ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
- python - TPOT 是否支持多标签文本分类?
- c# - DataGrid内的矩形,绑定矩形的宽度值
- python - PyInstaller --noconsole 在运行应用程序后仍然显示控制台