How do I resize pngs with transparency in PHP? How do I resize pngs with transparency in PHP? php php

How do I resize pngs with transparency in PHP?


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

<?php/** * https://stackoverflow.com/a/279310/470749 *  * @param resource $image * @param int $newWidth * @param int $newHeight * @return resource */public function getImageResized($image, int $newWidth, int $newHeight) {    $newImg = imagecreatetruecolor($newWidth, $newHeight);    imagealphablending($newImg, false);    imagesavealpha($newImg, true);    $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);    imagefilledrectangle($newImg, 0, 0, $newWidth, $newHeight, $transparent);    $src_w = imagesx($image);    $src_h = imagesy($image);    imagecopyresampled($newImg, $image, 0, 0, 0, 0, $newWidth, $newHeight, $src_w, $src_h);    return $newImg;}?>

UPDATE : This code is working only on background transparent with opacity = 0. If your image have 0 < opacity < 100 it'll be black background.


Here is a final solution that is working fine 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;}


The filling of the new image with a transparent colour is also required (as Dycey coded but I'm guessing forgot to mention :)), not just the 'strategic' saving by itself.

IIRC, you also need to be sure PNGs are 24bit, ie truecolor, and not 8bit to avoid buggy behaviour.