Изменение размера PNG-изображения становится черным после загрузки в PHP

#php

Вопрос:

Я попытался создать миниатюру для каждого загруженного изображения. Это включает в себя изменение размера изображения до заданного соотношения, а также преобразование его в расширение .webp.

Но после загрузки он становится черным. Все, что я искал, не работает для меня, особенно это

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

Я также попытался сохранить его в файл .png imagepng($resized, $thumbnail_dir, $quality) , чтобы посмотреть, влияет ли это на проблему. Но все равно не повезло.

Вот мой код для создания миниатюр. Я надеюсь, что вы сможете мне помочь.

 // Create thumbnail
public function createThumbnail($image, $new_height, $dir, $quality = 100){
    $image_info = pathinfo($image);
    $ext = $image_info['extension'];
    $filename = $image_info['filename'];

    // Open original image
    if($ext == "jpeg" || $ext == "jpg"){
        $original = imagecreatefromjpeg($image);
    }else if($ext == "png"){
        $original = imagecreatefrompng($image);
    }else if($ext == "webp"){
        $original = imagecreatefromwebp($image);
    }

    // Get image dimensions
    $size = getimagesize($image);
    $original_width = $size[0];
    $original_height = $size[1];

    // Resize image
    if($new_height < $original_height){
        $ratio = $original_width / $original_height;
        $new_width = ceil($ratio * $new_height);
    }else{
        $new_width = $original_width;
        $new_height = $original_height;
    }
    
    $resized = imagecreatetruecolor($new_width, $new_height);

    $background = imagecolorallocate($resized, 255, 255, 255);
    imagecolortransparent($resized, $background);
    imagealphablending($resized, false);
    imagesavealpha($resized, true);
    
    imagecopyresampled(
        $resized, $original,
        0,0,0,0,
        $new_width, $new_height,
        $original_width, $original_height
    );

    // Save thumbnail
    $thumbnail_dir = $dir."thumb/".$filename.".webp";
    imagewebp($resized, $thumbnail_dir, $quality);

    imagedestroy($original);
    imagedestroy($resized);

    return $thumbnail_dir;
}
 

Комментарии:

1. Вы проверяли, активирована ли библиотека GD в вашем php.ini ?

2. Да, он уже активирован в моем php.ini

Ответ №1:

Вы можете попробовать это. Это должно сработать.

Я использую следующие две библиотеки для устранения этой проблемы.

https://github.com/rosell-dk/webp-convert

http://image.intervention.io/getting_started/installation

     use InterventionImageImageManager;
    use WebPConvertWebPConvert;

    function create_thumbnail_webp_image(){
    $msg = null;
    $target_dir = $_SERVER['DOCUMENT_ROOT'] . "/converted_images/";
    $target_file = $target_dir . basename($_FILES["upload_file_name"]["name"]);
    $unique_file_name = md5($_FILES["upload_file_name"]["name"] . time());
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
    $image_info = pathinfo($target_file);
    $target_file = $target_dir . $unique_file_name . '.' . $image_info['extension'];

    // Check if image file is a actual image or fake image
    if (isset($_POST["submit"])) {
        $check = getimagesize($_FILES["upload_file_name"]["tmp_name"]);
        if ($check !== false) {
            $uploadOk = 1;
        } else {
            $msg .= " File is not an image.";
            $uploadOk = 0;
        }
    }

     // Check if file already exists
    if (file_exists($target_file)) {
        $msg .= " File already exists.";
        $uploadOk = 0;
    }

    // Check file size
    if ($_FILES["upload_file_name"]["size"] > 500000) {
        $msg .= " Your file is too large.";
        $uploadOk = 0;
    }

    // Allow certain file formats
    if ($imageFileType != "jpg" amp;amp; $imageFileType != "png" amp;amp; $imageFileType != "jpeg"
        amp;amp; $imageFileType != "gif" amp;amp; $imageFileType != "webp") {
        $msg .= " Only JPG, JPEG, PNG, GIF, WEBP files are allowed.";
        $uploadOk = 0;
    }

    // Check if $uploadOk is set to 0 by an error
    if ($uploadOk == 0) {
        $msg .= " Sorry, your file was not uploaded.";
        redirect('new_banner_image', $image_id, $msg, 'warn');
    // if everything is ok, try to upload file
    } else {
        if (move_uploaded_file($_FILES["upload_file_name"]["tmp_name"], $target_file)) {
            if ($imageFileType != 'webp') {
                // Save the webp image
                WebPConvert::convert($target_file, $image_info['dirname'] . '/' . $unique_file_name . '.webp');
            }

            // use third party image library to fetch the image
            $manager = new ImageManager(array('driver' => 'gd'));

            // open an image file
            $img = $manager->make($target_file);

            // now you are able to resize the instance
            $img->resize(320, 240);


            // finally we save the image as a new file
            $img->save($image_info['dirname'] . '/' . $unique_file_name . '.png');


            $msg .= " The file " . basename($_FILES["upload_file_name"]["name"]) . " has been uploaded.";
        } else {
            $msg .= "Sorry, there was an error uploading your file.";
        }
    }
}
 

Комментарии:

1. Спасибо, я не знал об этих библиотеках. На самом деле я пытаюсь преобразовать измененное изображение в файл .webp, а не в исходное. Я просто немного подправил код, который вы предоставили, и, наконец, заставил его работать.