Search code examples
phphtmlimagetransparencyimage-resizing

Update Image Script to prevent transparency loss


So I know this question has been asked before, but I'm having trouble understanding how to implement the way to prevent an image from loosing it's transparent backgrounds.

My script allows me to set up a way to create thumbnails, and resize the uploaded image.

So here is my code below, can someone help me? Please and thank you! :)

Resize Function:

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

Here is the upload code:

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

Solution

  • See my answer here:

    Trouble keeping transparency with upload script

    I posted the answer below here too:

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