我尝试使用PHP(GD)调整图像大小并旋转图像,但是当图像旋转时,它会在右侧添加黑色边框。
这是我的代码:
$image = $_FILES["file"]["name"];
$uploadedfile = $_FILES['file']['tmp_name'];
if ($image) {
$filename = stripslashes($_FILES['file']['name']);
$i = strrpos($filename,".");
$l = strlen($filename) - $i;
$ext = substr($filename,$i+1,$l);
$extension = strtolower($ext);
if (($extension != "jpg") && ($extension != "jpeg")
&& ($extension != "png") && ($extension != "gif")) {
echo ' Unknown Image extension ';
$errors=1;
}
else {
$size=filesize($_FILES['file']['tmp_name']);
if($extension=="jpg" || $extension=="jpeg" ) {
$uploadedfile = $_FILES['file']['tmp_name'];
$src = imagecreatefromjpeg($uploadedfile);
}
else if($extension=="png") {
$uploadedfile = $_FILES['file']['tmp_name'];
$src = imagecreatefrompng($uploadedfile);
}
else {
$src = imagecreatefromgif($uploadedfile);
}
$max_width = 175;
$max_height = 100;
$size=GetImageSize($uploadedfile);
$width_ratio = ($size[0] / $max_width);
$height_ratio = ($size[1] / $max_height);
if($width_ratio >=$height_ratio)
{
$ratio = $width_ratio;
}
else
{
$ratio = $height_ratio;
}
$new_width = ($size[0] / $ratio);
$new_height = ($size[1] / $ratio);
$tmp=imagecreatetruecolor($new_width,$new_height);
if(function_exists("exif_read_data")){
$exif = @exif_read_data($uploadedfile);
$rotateImg = imagerotate($src,0,0);
if(!empty($exif['Orientation'])) {
switch($exif['Orientation']) {
case 8:
$rotateImg = imagerotate($src,90,0);
break;
case 3:
$rotateImg = imagerotate($src,180,0);
break;
case 6:
$rotateImg = imagerotate($src,-90,0);
break;
}
}
}
imagecopyresampled($tmp,$rotateImg,0,0,0,0,($new_width-1),($new_height-1),$size[0],$size[1]);
$filename = sha1(basename( $_FILES['file']['name']));
$path = dirname(__FILE__)."/../files/pictures/".$filename;
imagejpeg($tmp,$path,100);
imagedestroy($src);
imagedestroy($rotateImg);
imagedestroy($tmp);
}
}
我尝试了一些修改,比如这篇文章的答案: - A border appears when rotating image with gd + php - PHP - Rotate image with GD gives black borders - Why when i rotate the image black borders appear? PHP GD
但没有任何效果。
请伙计们帮帮我。
谢谢你
答案 0 :(得分:1)
如果EXIF数据表明需要旋转,则会出现问题,因为在旋转之后,高度和宽度的值仍然被视为相同。由于图像已旋转,因此这些值应相互切换。
旋转需要先进行,而不是最后进行,所以将旋转代码移到所有比率计算之上(就在声明$size
之后)。你需要跟踪90 / -90度的旋转:
$rotated = false;
if (!empty($exif['Orientation'])) {
switch ($exif['Orientation']) {
case 8:
$src = imagerotate($src, 90, 0);
$rotated = true;
break;
case 3:
$src = imagerotate($src, 180, 0);
break;
case 6:
$src = imagerotate($src, -90, 0);
$rotated = true;
break;
}
}
现在,如果方向已更改,您需要“翻转”值:
if ($rotated) {
$width = $size[1];
$height = $size[0];
} else {
$width = $size[0];
$height = $size[1];
}
在其余代码中,将$size[0]
的实例替换为$width
,将$size[1]
的实例替换为$height
以修复计算。
您还可以...($new_width-1),($new_height-1)...
只需...$new_width, $new_height...
即可正确调整已调整大小的图像,否则在生成的图像的右侧和底部会出现1px黑色边框。
答案 1 :(得分:0)
您应该旋转源图像而不是调整大小的版本。旋转后调整大小可以解决我的类似问题。