How to change png with transparency in PHP?

I am trying to resize png with a transparent background in PHP, and the code samples that I found on the Internet do not work for me. Here's the code I'm using, advice would be greatly appreciated!

$this->image = imagecreatefrompng($filename); imagesavealpha($this->image, true); $newImage = imagecreatetruecolor($width, $height); // Make a new transparent image and turn off alpha blending to keep the alpha channel $background = imagecolorallocatealpha($newImage, 255, 255, 255, 127); imagecolortransparent($newImage, $background); imagealphablending($newImage, false); imagesavealpha($newImage, true); imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); $this->image = $newImage; imagepng($this->image,$filename); 


I don't work update , I wanted to say that the background color changes to black when I resize png.

+34
php resize png gd
Nov 10 '08 at 21:28
source share
9 answers

From what I can say, you need to set the blending mode to false , and the save alpha channel flag is true until you do imagecolorallocatealpha ()

 <?php $newImg = imagecreatetruecolor($nWidth, $nHeight); imagealphablending($newImg, false); imagesavealpha($newImg,true); $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127); imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent); imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $imgInfo[0], $imgInfo[1]); ?> 

UPDATE : this code only works against a transparent background with opacity = 0. If your image has 0 <opacity <100 it will be a black background.

+67
Nov 10 '08 at
source share

Here is the final solution that works great for me.

 function resizePng($im, $dst_width, $dst_height) { $width = imagesx($im); $height = imagesy($im); $newImg = imagecreatetruecolor($dst_width, $dst_height); imagealphablending($newImg, false); imagesavealpha($newImg, true); $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127); imagefilledrectangle($newImg, 0, 0, $width, $height, $transparent); imagecopyresampled($newImg, $im, 0, 0, 0, 0, $dst_width, $dst_height, $width, $height); return $newImg; } 
+8
Aug 07 '13 at 18:04 on
source share

It also requires filling the new image with transparent color (since Dycey is encoded, but I guess I forget to mention :)), and not just the β€œstrategic” salvation in itself.

IIRC, you must also be sure that PNG is 24bit, i.e. truecolor, not 8 bits to avoid erroneous behavior.

+4
Nov 10 '08 at 23:26
source share

old thread, but just in case - the Dycey example should work if you name things correctly. Here is a modified version used in my resize class. Pay attention to the check to make sure imagecolorallocatealpha () is defined, which will not happen if you use GD <2.0.8

  /** * usually when people use PNGs, it because they need alpha channel * support (that means transparency kids). So here we jump through some * hoops to create a big transparent rectangle which the resampled image * will be copied on top of. This will prevent GD from using its default * background, which is black, and almost never correct. Why GD doesn't do * this automatically, is a good question. * * @param $w int width of target image * @param $h int height of target image * @return void * @private */ function _preallocate_transparency($w, $h) { if (!empty($this->filetype) && !empty($this->new_img) && $this->filetype == 'image/png')) { if (function_exists('imagecolorallocatealpha')) { imagealphablending($this->new_img, false); imagesavealpha($this->new_img, true); $transparent = imagecolorallocatealpha($this->new_img, 255, 255, 255, 127); imagefilledrectangle($this->new_img, 0, 0, $tw, $th, $transparent); } } } 
+4
Oct 31 '09 at 20:44
source share

This is probably due to newer versions of PHP (I tested with PHP 5.6), but now it works without having to fill the image with a transparent background:

 $image_p = imagecreatetruecolor(480, 270); imageAlphaBlending($image_p, false); imageSaveAlpha($image_p, true); $image = imagecreatefrompng('image_with_some_transaprency.png'); imagecopyresampled($image_p, $image, 0, 0, 0, 0, 480, 270, 1920, 1080); imagepng($image_p, 'resized.png', 0); 
+3
May 01 '15 at 4:06
source share

this also does not work for me :( thisis my solution .. but i also get a black background and the image is not transparent

  <?php $img_id = 153; $source = "images/".$img_id.".png"; $source = imagecreatefrompng($source); $o_w = imagesx($source); $o_h = imagesy($source); $w = 200; $h = 200; $newImg = imagecreatetruecolor($w, $h); imagealphablending($newImg, false); imagesavealpha($newImg,true); $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127); imagefilledrectangle($newImg, 0, 0, $w, $h, $transparent); imagecopyresampled($newImg, $source, 0, 0, 0, 0, $w, $h, $o_w, $o_h); imagepng($newImg, $img_id.".png"); ?> <img src="<?php echo $img_id.".png" ?>" /> 
+2
Apr 24 '13 at 14:43
source share

Full example. Please note that for some png images found on the Internet, it does not work correctly, but for my own creation using Photoshop it works fine.

  header('Content-Type: image/png'); $filename = "url to some image"; $newWidth = 300; $newHeight = 300; $imageInfo = getimagesize($filename); $image = imagecreatefrompng($filename); //create source image resource imagesavealpha($image, true); //saving transparency $newImg = imagecreatetruecolor($newWidth, $newHeight); //creating conteiner for new image imagealphablending($newImg, false); imagesavealpha($newImg,true); $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127); //seting transparent background imagefilledrectangle($newImg, 0, 0, $newWidth, $newHeight, $transparent); imagecopyresampled($newImg, $image, 0, 0, 0, 0, $newWidth, $newHeight, $imageInfo[0], $imageInfo[1]); imagepng($newImg); //printout image string 
+1
Jul 02 '13 at
source share

Here is the complete code for working with png files while maintaining the transparency of their images.

 list($width, $height) = getimagesize($filepath); $new_width = "300"; $new_height = "100"; if($width>$new_width && $height>$new_height) { $image_p = imagecreatetruecolor($new_width, $new_height); imagealphablending($image_p, false); imagesavealpha($image_p, true); $image = imagecreatefrompng($filepath); imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); imagepng($image_p,$filepath,5); } 
0
Sep 01 '16 at 10:01
source share

None of these solutions helped me. That is how I decided to solve the problem.

 // upload directory $upload_dir = "../uploads/"; // valid image formats $valid_formats = array("jpg", "jpeg", "png"); // maximum image size 1 mb $max_size = 1048576; // crop image width, height $nw = $nh = 800; $nw1 = $nh1 = 400; $nw3 = $nh3 = 200; $nw2 = $nh2 = 100; // checks that if upload_dir a directory/not if (is_dir($upload_dir) && is_writeable($upload_dir)) { // not empty file if (!empty($_FILES['image'])) { // assign file name $name = $_FILES['image']['name']; // $_FILES to execute all files within a loop if ($_FILES['image']['error'] == 4) { $message = "Empty FIle"; } if ($_FILES['image']['error'] == 0) { if ($_FILES['image']['size'] > $max_size) { echo "E-Image is too large!<br>"; $_SESSION['alert'] = "Image is too large!!"; } else if (!in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats)) { $_SESSION['alert'] = "This image is not a valid image format!!"; echo "E-This image is not a valid image format<br>"; } else if (file_exists($upload_dir . $name)) { $_SESSION['alert'] = "Image already exists!!"; echo "E-Image already exists<br>"; } else { // No error found! Move uploaded files $size = getimagesize($_FILES['image']['tmp_name']); $x = (int) $_POST['x']; $y = (int) $_POST['y']; $w = (int) $_POST['w'] ? $_POST['w'] : $size[0]; $h = (int) $_POST['h'] ? $_POST['h'] : $size[1]; // path for big image $big_image_path = $upload_dir . "big/" . $name; // medium image path $medium_image_path = $upload_dir . "medium/" . $name; // small image path $small_image_path = $upload_dir . "small/" . $name; // check permission if (!is_dir($upload_dir . "big/") && !is_writeable($upload_dir . "big/")) { mkdir($upload_dir . "big/", 0777, false); } if (!is_dir($upload_dir . "medium/") && !is_writeable($upload_dir . "medium/")) { mkdir($upload_dir . "medium/", 0777, false); } if (!is_dir($upload_dir . "small/") && !is_writeable($upload_dir . "small/")) { mkdir($upload_dir . "small/", 0777, false); } // image raw data from form $data = file_get_contents($_FILES["image"]["tmp_name"]); // create image $vImg = imagecreatefromstring($data); //create big image $dstImg = imagecreatetruecolor($nw, $nh); imagealphablending($dstImg, false); $trans_colour = imagecolorallocatealpha($dstImg, 0, 0, 0, 127); imagefilledrectangle($dstImg, 0, 0, $w, $h, $trans_colour); imagesavealpha($dstImg, true); imagecopyresampled($dstImg, $vImg, 0, 0, $x, $y, $nw, $nh, $w, $h); imagepng($dstImg, $big_image_path); //create medium thumb $dstImg1 = imagecreatetruecolor($nw1, $nh1); imagealphablending($dstImg1, false); $trans_colour1 = imagecolorallocatealpha($dstImg1, 0, 0, 0, 127); imagefilledrectangle($dstImg1, 0, 0, $w, $h, $trans_colour1); imagesavealpha($dstImg1, true); imagecopyresampled($dstImg1, $vImg, 0, 0, $x, $y, $nw1, $nh1, $w, $h); imagepng($dstImg1, $medium_image_path); // create smallest thumb $dstImg2 = imagecreatetruecolor($nw2, $nh2); imagealphablending($dstImg2, false); $trans_colour2 = imagecolorallocatealpha($dstImg2, 0, 0, 0, 127); imagefilledrectangle($dstImg2, 0, 0, $w, $h, $trans_colour2); imagesavealpha($dstImg2, true); imagecopyresampled($dstImg2, $vImg, 0, 0, $x, $y, $nw2, $nh2, $w, $h); imagepng($dstImg2, $small_image_path); /* * Database insertion */ $sql = "INSERT INTO tbl_inksand_product_gallery (" . "Product_Id,Gallery_Image_Big,Gallery_Image_Medium,Gallery_Image_Thumb," . "Gallery_Status,Created_By,Created_Datetime" . ") VALUES (" . "'{$Product_Id}','{$big_image_path}','{$medium_image_path}','{$small_image_path}'," . "'A','$Created_By','{$time}'" . ")"; db_query($sql); if (db_affected_rows() == 1) { if (imagedestroy($dstImg)) { $_SESSION['success'] = "Image uploaded successfully."; echo "S-Image uploaded successfully<br>"; } else { $_SESSION['alert'] = "Image not uploaded!!"; echo "S-Image not uploaded"; } } else { $_SESSION['alert'] = "Error in uploading image!!"; echo "E-Error in uploading image!!"; } } } } } else { mkdir($upload_dir, 0777); } 
0
Sep 02 '16 at 5:43 on
source share



All Articles