无法通过上传脚本保持透明度

Trouble keeping transparency with upload script

所以我不确定我做错了什么,我认为我已经完美地工作了,直到我上传了一个透明背景的 PNG,然后它以黑色背景保存。谁能指出我做错了什么?这是我的图片 class 和上传代码。我认为 'imagecreatefrompng' 部分可以保持透明度,但也许我错了或做错了?

图片Class

    <?php
ini_set("memory_limit","50M");

function normal_resize_image($source, $destination, $image_type, $max_size, $image_width, $image_height, $quality){

    if($image_width <= 0 || $image_height <= 0){return false;} //return false if nothing to resize

    //do not resize if image is smaller than max size
    if($image_width <= $max_size && $image_height <= $max_size){
        if(save_image($source, $destination, $image_type, $quality)){
            return true;
        }
    }

    //Construct a proportional size of new image
    $image_scale    = min($max_size/$image_width, $max_size/$image_height);
    $new_width      = ceil($image_scale * $image_width);
    $new_height     = ceil($image_scale * $image_height);

    $new_canvas     = imagecreatetruecolor( $new_width, $new_height ); //Create a new true color image
    imagealphablending($new_canvas,true);

    //Copy and resize part of an image with resampling
    if(imagecopyresampled($new_canvas, $source, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height)){
        save_image($new_canvas, $destination, $image_type, $quality); //save resized image
    }

    return true;
}

function thumb_resize_image($source, $destination, $image_type, $max_size, $image_width, $image_height, $quality){

    if($image_width <= 0 || $image_height <= 0){return false;} //return false if nothing to resize

    //do not resize if image is smaller than max size
    if($image_width <= $max_size && $image_height <= $max_size){
        if(save_image($source, $destination, $image_type, $quality)){
            return true;
        }
    }

    //Construct a proportional size of new image
    $image_scale    = min($max_size/$image_width, $max_size/$image_height);
    $new_width      = ceil($image_scale * $image_width);
    $new_height     = ceil($image_scale * $image_height);

    $new_canvas     = imagecreatetruecolor( $new_width, $new_height ); //Create a new true color image
    imagealphablending($new_canvas,true);

    //Copy and resize part of an image with resampling
    if(imagecopyresampled($new_canvas, $source, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height)){
        save_image($new_canvas, $destination, $image_type, $quality); //save resized image
    }

    return true;
}

##### This function corps image to create exact square, no matter what its original size! ######
function crop_image_square($source, $destination, $image_type, $square_size, $image_width, $image_height, $quality){
    if($image_width <= 0 || $image_height <= 0){return false;} //return false if nothing to resize

    if( $image_width > $image_height )
    {
        $y_offset = 0;
        $x_offset = ($image_width - $image_height) / 2;
        $s_size     = $image_width - ($x_offset * 2);
    }else{
        $x_offset = 0;
        $y_offset = ($image_height - $image_width) / 2;
        $s_size = $image_height - ($y_offset * 2);
    }
    $new_canvas = imagecreatetruecolor( $square_size, $square_size); //Create a new true color image
    imagealphablending($new_canvas,true);

    //Copy and resize part of an image with resampling
    if(imagecopyresampled($new_canvas, $source, 0, 0, $x_offset, $y_offset, $square_size, $square_size, $s_size, $s_size)){
        save_image($new_canvas, $destination, $image_type, $quality);
    }

    return true;
}

##### Saves image resource to file ##### 
function save_image($source, $destination, $image_type, $quality){
    switch(strtolower($image_type)){//determine mime type
        case 'image/png': 
            imagepng($source, $destination); return true; //save png file
            break;
        case 'image/gif': 
            imagegif($source, $destination); return true; //save gif file
            break;          
        case 'image/jpeg': case 'image/pjpeg': 
            imagejpeg($source, $destination, $quality); return true; //save jpeg file
            break;
        default: return false;
    }
}
?>

这是要上传的代码。

if(isset($_POST['addImages'])) {    
        $valid_formats = array("jpg", "jpeg", "png", "gif", "bmp", "JPG", "JPEG", "PNG", "GIF", "BMP");
        $max_file_size = 50971520; //50mb
        $path = "images/media/"; // Upload directory
        $count = 0;

        $thumb_square_size = 300; //Thumbnails will be cropped 
        $max_image_size = 1200; //Maximum image size (height and width)
        $thumb_prefix = "_thumb"; //Normal thumb Prefix
        $destination_folder = 'images/media/'; //upload directory ends with / (slash)
        $jpeg_quality = 90; //jpeg quality

        // Loop $_FILES to execute all files
        foreach ($_FILES['files']['name'] as $foto => $name) {
            if ($_FILES['files']['error'][$foto] == 4) {
                continue; // Skip file if any error found
            }          
            if ($_FILES['files']['error'][$foto] == 0) {          
                if ($_FILES['files']['size'][$foto] > $max_file_size) {
                    $message[] = "$name is too large!.";
                    continue; // Skip large files
                }
                elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ){
                    $message[] = "$name is not a valid format";
                    continue; // Skip invalid file formats
                }
                else { // No error found! 
                    $image_name = $name; //file name
                    $image_size = $_FILES['files']['size'][$foto]; //file size
                    $image_temp = $_FILES['files']['tmp_name'][$foto]; //file temp
                    $image_size_info = getimagesize($image_temp); //get image size

                    if($image_size_info){
                        $image_width = $image_size_info[0]; //image width
                        $image_height = $image_size_info[1]; //image height
                        $image_type = $image_size_info['mime']; //image type
                    } else {
                        die("Make sure image file is valid!");
                    }

                //switch statement below checks allowed image type as well as creates new image from given file.
                switch($image_type){
                    case 'image/png':
                        $image_res = imagecreatefrompng($image_temp);
                        imageAlphaBlending($image_res, true);
                        imageSaveAlpha($image_res, true);
                        break;
                    case 'image/gif':
                        $image_res = imagecreatefromgif($image_temp); break;            
                    case 'image/jpeg': case 'image/pjpeg':
                        $image_res = imagecreatefromjpeg($image_temp); break;
                    default:
                        $image_res = false;
                }

                    if($image_res){
                        //Get file extension and name to construct new file name 
                        $image_info = pathinfo($image_name);
                        $image_extension = strtolower($image_info["extension"]); //image extension
                        $image_name_only = strtolower($image_info["filename"]);//file name only, no extension
                        $dateRec = date('d-M-Y-h-i-s');

                        //create a random name for new image (Eg: fileName_293749.jpg) ;
                        $new_file_name = $dateRec. '_' .  rand(0, 9999999999);
                        //folder path to save resized images and thumbnails
                        $thumb_save_folder  = $destination_folder . $new_file_name . $thumb_prefix . '.' . $image_extension ; 
                        $image_save_folder  = $destination_folder . $new_file_name. '.' . $image_extension;

                        //call normal_resize_image() function to proportionally resize image
                        if(normal_resize_image($image_res, $image_save_folder, $image_type, $max_image_size, $image_width, $image_height, $jpeg_quality)) {
                            //call crop_image_square() function to create square thumbnails
                            if(!thumb_resize_image($image_res, $thumb_save_folder, $image_type, $thumb_square_size, $image_width, $image_height, $jpeg_quality)) { 
                                die('Error Creating thumbnail'); 
                            }

                        }
                    }

                    $post_img = $new_file_name.'.'.$image_extension;
                    $post_img_thumb = $new_file_name.$thumb_prefix.'.'.$image_extension;
                    $stmt = $mysqli->prepare('INSERT INTO media_images(image, image_thumb, members_id) VALUES (?,?,?)');
                    $stmt->bind_param('ssi', $post_img, $post_img_thumb, $members_id);
                    $stmt->execute();
                    $stmt->close();

                    $count++;
                }
            }
        }
        $MEMUS = memory_get_usage();
        ob_start();
        header("Location: media.php");
    }

您必须使用 imagealphablending()。将 imagealphablending($new_canvas,true); 放在 imagecreatetruecolor 命令之后。

您在创建图像或图层时也需要使用 imagealphablending。因此,在您的上传中,您将在 imagecreatefromX 切换之后以及 imagecopyresampled 调用之后使用它。

You need to enable alpha and save the setting

    case 'image/png':
        $image_res =  imagecreatefrompng($image_temp);
        imageAlphaBlending($image_res, true);
        imageSaveAlpha($image_res, true);
        break;

您的问题已通过以下方式解决。

  function resizeImage($source, $destination, $image_type, $max_size, $image_width, $image_height, $quality) {
                //RETURN FALSE IF NOTHING TO RESIZE
                if($image_width <= 0 || $image_height <= 0){return false;}

                //CHECK IF SMALLER THAN THE MAX SIZES
                if($image_width <= $max_size && $image_height <= $max_size) { //IF SMALLER THAN MAX SIZES
                    $new_width = $image_width;
                    $new_height = $image_height;
                } else { //ELSE CONSTRUCT PROPORTIONAL SIZE OF NEW IMAGE
                    $image_scale = min($max_size/$image_width, $max_size/$image_height);
                    $new_width = ceil($image_scale * $image_width);
                    $new_height = ceil($image_scale * $image_height);
                }

                $new_canvas = imagecreatetruecolor($new_width, $new_height);
                $black = imagecolorallocate($new_canvas, 0, 0, 0);
                imagecolortransparent($new_canvas, $black);
                imagealphablending($new_canvas,false);
                imagesavealpha($new_canvas, true);

                if(imagecopyresampled($new_canvas, $source, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height)){
                    $this->save_image($new_canvas, $destination, $image_type, $quality);
                }
                return true;
            }
//Resize Image Normal
        function normal_resize_image($source, $destination, $image_type, $max_size, $image_width, $image_height, $quality) {
            //RETURN FALSE IF NOTHING TO RESIZE
            if($image_width <= 0 || $image_height <= 0){return false;}

            //CHECK IF SMALLER THAN THE MAX SIZES
            if($image_width <= $max_size && $image_height <= $max_size) { //IF SMALLER THAN MAX SIZES
                $new_width = $image_width;
                $new_height = $image_height;
            } else { //ELSE CONSTRUCT PROPORTIONAL SIZE OF NEW IMAGE
                $image_scale = min($max_size/$image_width, $max_size/$image_height);
                $new_width = ceil($image_scale * $image_width);
                $new_height = ceil($image_scale * $image_height);
            }

            $new_canvas = imagecreatetruecolor($new_width, $new_height);
            $black = imagecolorallocate($new_canvas, 0, 0, 0);
            imagecolortransparent($new_canvas, $black);
            imagealphablending($new_canvas,false);
            imagesavealpha($new_canvas, true);

            if(imagecopyresampled($new_canvas, $source, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height)){
                $this->save_image($new_canvas, $destination, $image_type, $quality);
            }
            return true;
        }

如果可行,请告诉我。可能需要为您做一些调整。