private function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct)
    {
        $pct /= 100;

        // Get image width and height
        $w = imagesx($src_im);
        $h = imagesy($src_im);
        // Turn alpha blending off
        imagealphablending($src_im, false);
        // Find the most opaque pixel in the image (the one with the smallest alpha value)
        $minalpha = 127;
        for ($x = 0; $x < $w; $x++) {
            for ($y = 0; $y < $h; $y++) {
                $alpha = (imagecolorat($src_im, $x, $y) >> 24) & 0xFF;
                if ($alpha < $minalpha) {
                    $minalpha = $alpha;
                }
            }
        }
        // Loop through image pixels and modify alpha for each
        for ($x = 0; $x < $w; $x++) {
            for ($y = 0; $y < $h; $y++) {
                // Get current alpha value (represents the TANSPARENCY!)
                $colorxy = imagecolorat($src_im, $x, $y);
                $alpha = ($colorxy >> 24) & 0xFF;
                // Calculate new alpha
                if ($minalpha !== 127) {
                    $alpha = 127 + 127 * $pct * ($alpha - 127) / (127 - $minalpha);
                } else {
                    $alpha += 127 * $pct;
                }
                // Get the color index with new alpha
                $alphacolorxy = imagecolorallocatealpha($src_im, ($colorxy >> 16) & 0xFF, ($colorxy >> 8) & 0xFF, $colorxy & 0xFF, $alpha);
                // Set pixel with the new color + opacity
                if (!imagesetpixel($src_im, $x, $y, $alphacolorxy)) {
                    return false;
                }
            }
        }
        imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
    }
private function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct)
    {
        $pct /= 100;

        // Get image width and height
        $w = imagesx($src_im);
        $h = imagesy($src_im);
        // Turn alpha blending off
        imagealphablending($src_im, false);
        // Find the most opaque pixel in the image (the one with the smallest alpha value)
        $minalpha = 127;
        for ($x = 0; $x < $w; $x++) {
            for ($y = 0; $y < $h; $y++) {
                $alpha = (imagecolorat($src_im, $x, $y) >> 24) & 0xFF;
                if ($alpha < $minalpha) {
                    $minalpha = $alpha;
                }
            }
        }
        // Loop through image pixels and modify alpha for each
        for ($x = 0; $x < $w; $x++) {
            for ($y = 0; $y < $h; $y++) {
                // Get current alpha value (represents the TANSPARENCY!)
                $colorxy = imagecolorat($src_im, $x, $y);
                $alpha = ($colorxy >> 24) & 0xFF;
                // Calculate new alpha
                if ($minalpha !== 127) {
                    $alpha = 127 + 127 * $pct * ($alpha - 127) / (127 - $minalpha);
                } else {
                    $alpha += 127 * $pct;
                }
                // Get the color index with new alpha
                $alphacolorxy = imagecolorallocatealpha($src_im, ($colorxy >> 16) & 0xFF, ($colorxy >> 8) & 0xFF, $colorxy & 0xFF, $alpha);
                // Set pixel with the new color + opacity
                if (!imagesetpixel($src_im, $x, $y, $alphacolorxy)) {
                    return false;
                }
            }
        }
        imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);
    }
private function imagecopymerge_alpha ( $ dst_im , $ src_im , $ dst_x , $ dst_y , $ src_x , $ src_y , $ src_w , $ src_h , $ pct ) { $ pct /= 100 ; // Get image width and height $ w = imagesx ( $ src_im ) ; $ h = imagesy ( $ src_im ) ; // Turn alpha blending off imagealphablending ( $ src_im , false ) ; // Find the most opaque pixel in the image (the one with the smallest alpha value) $ minalpha = 127 ; for ( $ x = 0 ; $ x < $ w ; $ x ++ ) { for ( $ y = 0 ; $ y < $ h ; $ y ++ ) { $ alpha = ( imagecolorat ( $ src_im , $ x , $ y ) >> 24 ) & 0xFF ; if ( $ alpha < $ minalpha ) { $ minalpha = $ alpha ; } } } // Loop through image pixels and modify alpha for each for ( $ x = 0 ; $ x < $ w ; $ x ++ ) { for ( $ y = 0 ; $ y < $ h ; $ y ++ ) { // Get current alpha value (represents the TANSPARENCY!) $ colorxy = imagecolorat ( $ src_im , $ x , $ y ) ; $ alpha = ( $ colorxy >> 24 ) & 0xFF ; // Calculate new alpha if ( $ minalpha !== 127 ) { $ alpha = 127 + 127 * $ pct * ( $ alpha - 127 ) / ( 127 - $ minalpha ) ; } else { $ alpha += 127 * $ pct ; } // Get the color index with new alpha $ alphacolorxy = imagecolorallocatealpha ( $ src_im , ( $ colorxy >> 16 ) & 0xFF , ( $ colorxy >> 8 ) & 0xFF , $ colorxy & 0xFF , $ alpha ) ; // Set pixel with the new color + opacity if ( ! imagesetpixel ( $ src_im , $ x , $ y , $ alphacolorxy ) ) { return false ; } } } imagecopy ( $ dst_im , $ src_im , $ dst_x , $ dst_y , $ src_x , $ src_y , $ src_w , $ src_h ) ; }
Copymerge with preserves alpha-transparency in 24-bit PNGs

@param $dst_im
@param $src_im
@param $dst_x
@param $dst_y
@param $src_x
@param $src_y
@param $src_w
@param $src_h
@param $pct
@return bool
Copymerge with preserves alpha - transparency in 24 - bit PNGs