首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP中上传后,调整PNG图像的大小变黑

问在PHP中上传后,调整PNG图像的大小变黑
EN

Stack Overflow用户
提问于 2021-09-30 11:26:33
回答 1查看 144关注 0票数 0

我试着为上传的每一张图片创建一个缩略图。它包括将图像调整为指定的比率,并将其转换为.webp扩展。

但上传后就变黑了。我所寻找的不是为我工作,特别是这个

代码语言:javascript
复制
imagealphablending($resized, false);
imagesavealpha($resized, true);

我还尝试使用.png将其保存到imagepng($resized, $thumbnail_dir, $quality)中,以查看这是否会影响问题。但还是没有运气。

这是我创建缩略图的代码。我希望你能帮助我。

代码语言:javascript
复制
// 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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-30 18:29:25

你可以试试这个。应该能用的。

我正在使用以下两个库来解决这个问题。

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

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

代码语言:javascript
复制
    use Intervention\Image\ImageManager;
    use WebPConvert\WebPConvert;

    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" && $imageFileType != "png" && $imageFileType != "jpeg"
        && $imageFileType != "gif" && $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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69391408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档