Неправильное изменение размера изображения с помощью библиотеки GD - PullRequest
0 голосов
/ 17 января 2019

Я разрабатываю собственный скрипт для импорта фотографий из папки 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 голосов
/ 17 января 2019

В вашей функции resize_image вы возвращаете $src, который должен измениться на $dst с измененным размером изображения.

Таким образом, в вашей функции измените return $src; строку на return $dst;, и она будет работать.

...