更新图像脚本以防止透明度丢失


Update Image Script to prevent transparency loss

所以我知道以前有人问过这个问题,但我很难理解如何实现防止图像失去透明背景的方法。

我的脚本允许我设置一种方法来创建缩略图,并调整上传图像的大小。

下面是我的代码,有人能帮我吗?谢谢!:)

调整大小功能:

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
        //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
        //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
        //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;
        }
    }

这是上传代码:

$sm_square_size = 300; //will ! be cropped 
$md_square_size = 600; //will ! be cropped 
$max_image_size = 1200; //Maximum image size (height and width)
$lg_prefix = "_lg"; //Large thumb Prefix
$md_prefix = "_md"; //Medium thumb Prefix
$sm_prefix = "_sm"; //Small thumb Prefix
$destination_folder = 'images/post_images/'; //upload directory ends with / (slash)
$jpeg_quality = 90; //jpeg quality
$image_name = $_FILES['image_file']['name']; //file name
//IF IMAGE UPLOADED
if($image_name != "") {
    $image_size = $_FILES['image_file']['size']; //file size
    $image_temp = $_FILES['image_file']['tmp_name']; //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); 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.$sm_prefix.'.'.$image_extension;
        $medium_save_folder = $destination_folder.$new_file_name.$md_prefix.'.'.$image_extension;
        $large_save_folder = $destination_folder.$new_file_name.$lg_prefix.'.'.$image_extension;
        //call normal_resize_image() function to proportionally resize image
        if(normal_resize_image($image_res, $large_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, $sm_square_size, $image_width, $image_height, $jpeg_quality))
            { die('Error Creating thumbnail'); }
            if(!thumb_resize_image($image_res, $medium_save_folder, $image_type, $md_square_size, $image_width, $image_height, $jpeg_quality))
            { die('Error Creating thumbnail'); }
            $post_img_lg_New = $new_file_name.$lg_prefix.'.'.$image_extension;
            $post_img_md_New = $new_file_name.$md_prefix.'.'.$image_extension;
            $post_img_sm_New = $new_file_name.$sm_prefix.'.'.$image_extension;
            $stmt = $mysqli->prepare('UPDATE HERE');
            $stmt->bind_param('is', $results);
            $stmt->execute();
            $stmt->close();
        }
    }
//IF NO IMAGE UPLOADED
}

在这里查看我的答案:

上传脚本无法保持透明度

我也在下面发布了答案:

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;
        }