Я пытаюсь изменить размер и повернуть изображение с помощью 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);}
}
Я попробовал некоторые модификации, такие как ответы на эти посты:
— При повороте изображения с помощью gd + php появляется рамка
— PHP — Поворот изображения с GD дает черные границы
— Почему при повороте изображения появляются черные полосы? PHP GD
Но ничего не работает.
Пожалуйста, ребята, помогает мне.
Спасибо вам
Проблема возникает, если данные 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...
для правильного размещения измененного изображения, в противном случае в нижней и нижней части результирующего изображения будет черная полоса размером 1 пиксель.
Других решений пока нет …