使用GD库无法正确调整图像大小

时间:2019-01-17 09:50:03

标签: php wordpress gd

我正在开发一个自定义脚本,以将照片从FTP文件夹导入Wordpress。由于由于特定的客户请求,我不包括wp-load,因此无法使用$ wpdb等各种类……

所以我不得不创建整个脚本,但是发现在应用水印的情况下调整照片大小的问题...

此脚本会拾取文件夹中的照片,将高质量的原始照片移到公开的隐藏文件夹中,然后再以较低的分辨率创建副本并在上面应用水印。

这是循环文件夹中包含的每张照片的主要功能:

function generate_resized_image($path_to, $path_from, $image, $sell_media_dir){
    $upload_dir = wp_upload_dir();

    $all_size = array(
        '1' => array('width'=>150, 'height'=>150), //thumbnail
        '2' => array('width'=>620, 'height'=>357), //medium
        '3' => array('width'=>768, 'height'=>442), //medium_large
        '4' => array('width'=>100, 'height'=>70), //very-small
        '5' => array('width'=>300, 'height'=>200), //max-user-view
    );

    rename(str_replace(".jpg", ".JPG", $path_from), str_replace(".JPG", ".jpg", $path_to));
    $newname = explode(".", $image);

    foreach($all_size as $size){

        //$path_to_save = $sell_media_dir."/".$newname[0]."-".$size['width']."x".$size['height'].".jpg";
        $path_to_sell = $upload_dir['path']."/".$newname[0]."-".$size['width']."x".$size['height'].".jpg";

        $img = resize_image( str_replace( ".JPG", ".jpg", $path_to ), $size['width'], $size['height'], $cut=($size['width'] == $size['height']) ? true : false);
        imagejpeg($img, $path_to_sell, 10);

        echo 'Immagine creata: ' . $newname[0]."-".$size['width']."x".$size['height'].".jpg ". PHP_EOL;

        //rename($path_to_save, $path_to_sell);
    }

    $or_image = imagecreatefromjpeg( str_replace( ".JPG", ".jpg", $path_to ) );

    imagejpeg($or_image, $upload_dir['path']."/".str_replace(".JPG",".jpg",$image), 10);

    $img_size = getimagesize($upload_dir['path']."/".str_replace(".JPG",".jpg",$image));

    return array(
        'width' => $img_size[0],
        'height' => $img_size[1]
    );
}

此调用函数resize_image,理论上,该函数通过应用上面的水印来调整图像的大小。

function resize_image($file, $w, $h, $crop=FALSE) {

    $stamp = imagecreatefrompng('./wp-content/uploads/2018/11/spanshot_watermark.png');

    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($r-$w/$h)));
        } else {
            $height = ceil($height-($height*abs($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }

    $src = imagecreatefromjpeg($file);

    $w = imagesx($src);
    $h = imagesy($src);

    $stamp = PNGResize($stamp, $w, $h);

    $sx = imagesx($stamp);
    $sy = imagesy($stamp);

    // $par1 = (imagesx($src)/2)-($sx/2);
    // $par2 = (imagesy($src)/2)-($sy/2);

    imagecopy($src, $stamp, 0, 0, 0, 0, imagesx($stamp), imagesy($stamp));

    echo "La lunghezza nuova è: " . $newwidth . PHP_EOL;
    echo "L'altezza nuova è: " . $newheight . PHP_EOL;

    $dst = imagecreatetruecolor($newwidth, $newheight);

    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    return $src;
}

最后,此函数调用PNGResize来调整水印的大小,同时保持透明度,从而使后者适应要调整大小的图像的大小。

function PNGResize($image, $w, $h)
{
    $oldw = imagesx($image);
    $oldh = imagesy($image);
    $temp = imagecreatetruecolor($w, $h);

    imagealphablending( $temp, false );
    imagesavealpha( $temp, true );

    imagecopyresampled($temp, $image, 0, 0, 0, 0, $w, $h, $oldw, $oldh);

    return $temp;
}

除了调整可移动图像的大小外,所有这些操作均正常工作,可移动图像的大小与参数无关紧要,从而降低了质量。

这些是右侧文件夹中的原始图像: enter image description here

这些是正确移动但没有适当调整大小的图像。

enter image description here

我不明白为什么图片没有根据过去的尺寸调整大小,有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

在您的resize_image函数中,您将返回$src,该值应随$dst(已调整大小的图像)而改变。

因此,在您的函数中,将return $src;行更改为return $dst;,它将起作用。