GD PHP 旋转图像黑边

GD PHP Rotate Image Black Border

我尝试使用 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);


        }
    }

我尝试了一些修改,比如这个帖子的答案: - - PHP - Rotate image with GD gives black borders - Why when i rotate the image black borders appear? 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;
    }
}

现在,如果方向已更改,您需要 'flip' 值:

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 的黑色边框。

您应该旋转源图像而不是调整后的版本。旋转后调整大小解决了我的类似问题。