Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP GD Use one image to mask another image, including transparency

Tags:

php

gd

I am trying to create a PHP script that takes an image:

image1
http://i.stack.imgur.com/eNvlM.png

and then applies a PNG image:

mask
http://i.stack.imgur.com/iJr2I.png

as a mask.

The end result needs to maintain transparency:

result
http://i.stack.imgur.com/u0l0I.png

If at all possible I want to do this in GD, ImageMagick is not really an option right now.

How would I go about this?

phalacee's post (in "PHP/GD, how to copy a circle from one image to another?") seems to be along the right lines but I specifically need to use an image as a mask, not a shape.

like image 525
Matt Avatar asked Aug 26 '11 10:08

Matt


1 Answers

Matt,

If you make your png with the oval white fill on black background instead of black fill with transparent background the following function does it.

<?php // Load source and mask $source = imagecreatefrompng( '1.png' ); $mask = imagecreatefrompng( '2.png' ); // Apply mask to source imagealphamask( $source, $mask ); // Output header( "Content-type: image/png"); imagepng( $source );  function imagealphamask( &$picture, $mask ) {     // Get sizes and set up new picture     $xSize = imagesx( $picture );     $ySize = imagesy( $picture );     $newPicture = imagecreatetruecolor( $xSize, $ySize );     imagesavealpha( $newPicture, true );     imagefill( $newPicture, 0, 0, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) );      // Resize mask if necessary     if( $xSize != imagesx( $mask ) || $ySize != imagesy( $mask ) ) {         $tempPic = imagecreatetruecolor( $xSize, $ySize );         imagecopyresampled( $tempPic, $mask, 0, 0, 0, 0, $xSize, $ySize, imagesx( $mask ), imagesy( $mask ) );         imagedestroy( $mask );         $mask = $tempPic;     }      // Perform pixel-based alpha map application     for( $x = 0; $x < $xSize; $x++ ) {         for( $y = 0; $y < $ySize; $y++ ) {             $alpha = imagecolorsforindex( $mask, imagecolorat( $mask, $x, $y ) );             $alpha = 127 - floor( $alpha[ 'red' ] / 2 );             $color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) );             imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $alpha ) );         }     }      // Copy back to original picture     imagedestroy( $picture );     $picture = $newPicture; }  ?> 
like image 91
Jules_Text Avatar answered Sep 20 '22 18:09

Jules_Text