问题
So I'm not sure what I'm doing wrong, I thought I had this working perfectly until I uploaded a PNG with a transparent background, and it saved after with a black background. Can anyone point out what I'm doing wrong? Here is my image class and upload code. I thought the 'imagecreatefrompng' section was what would keep the transparency, but maybe I'm wrong or doing it wrong?
Image 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;
}
}
?>
Here is the code to upload.
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");
}
回答1:
Your issue is fixed with the following.
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;
}
Let me know if that works. Might need some tweaking for you.
回答2:
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;
回答3:
You have to use imagealphablending(). Put imagealphablending($new_canvas,true);
after your imagecreatetruecolor
command.
You need to use imagealphablending any time you create an image or layer as well. So in your upload you'll use it after your imagecreatefromX switch and after your imagecopyresampled calls as well.
来源:https://stackoverflow.com/questions/31846129/trouble-keeping-transparency-with-upload-script