search for in the  
<imagecopyimagecopymergegray>
Last updated: Thu, 19 May 2005

imagecopymerge

(PHP 4 >= 4.0.1, PHP 5)

imagecopymerge -- Copy and merge part of an image

Description

int imagecopymerge ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct )

Copy a part of src_im onto dst_im starting at the x,y coordinates src_x, src_y with a width of src_w and a height of src_h. The portion defined will be copied onto the x,y coordinates, dst_x and dst_y. The two images will be merged according to pct which can range from 0 to 100. When pct = 0, no action is taken, when 100 this function behaves identically to imagecopy() for pallete images, while it implements alpha transparency for true colour images.

Note: This function was added in PHP 4.0.6



User Contributed Notes
imagecopymerge
backglancer in the hotmail
17-May-2005 04:44
I was about to kill myself....
any one of you trying to merge a SEMI transparent png...
use imagecopy  :)
<?
$flag
= imagecreatefrompng('flags/images/flagWhiteFill.png');
$mask = imagecreatefrompng('flags/images/flag_transparent.png');

imagealphablending($flag, 1);
imagealphablending($mask, 1);

imagecopy($flag, $mask, 0,0,0,0,25,43);

Header("Content-type: image/jpeg");
imagepng($flag);
?>

ImageSaveAlpha(resource, bool);  made the transparent color - not transparent... dunno why :)
barbarina_sv at libero dot it
17-May-2005 03:55
I needed to draw a "pointer" image over a map, but had some problems with png image transparency.
So I created a png image with white background (not transparent) and merged it on my map, after defining white color as transparent:

<?php

$src_file
= 'source.jpg';
list(
$src_w, $src_h, $src_t, $src_a) = getimagesize($src_file);

$ptr_file = 'pointer.png'; // must have no transparency, but white background
list($ptr_w, $ptr_h, $ptr_t, $ptr_a) = getimagesize($ptr_file);

// destination image dimensions:
$dst_w = 400;
$dst_h = 200;

// pointer position:
$ptr_x = 195;
$ptr_y = 70;

$srcImage = imageCreateFromJpeg($src_file) or die ('failed imageCreateFromJpg');
$dstImage = imageCreateTrueColor($dst_w, $dst_h) or die ('failed imageCreateTrueColor');

imageCopyResampled($dstImage, $srcImage, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h) or die ('failed imageCopyResampled');

$ptrImage = imageCreateFromPng($ptr_file) or die ('failed imageCreateFromPng');

$ptr_white = imageColorAllocate($ptrImage,255,255,255);
imageColorTransparent($ptrImage,$ptr_white);

imageCopyMerge($dstImage, $ptrImage, $ptr_x, $ptr_y, 0, 0, $ptr_w, $ptr_h, 100) or die ('failed imageCopyMerge');

imageJpeg($dstImage,'',100) or die ('failed imageJpeg');

imageDestroy($srcImage) or die ('failed imageDestroy(1)');
imageDestroy($dstImage) or die ('failed imageDestroy(2)');
imageDestroy($ptrImage) or die ('failed imageDestroy(3)');

?>
ingrid
04-Apr-2005 04:16
I found on the internet about a thousand copies of this "imageCopyMerge" script of Stefan.

Most of them had a  copyright notice of the copyist added, but none of them had added what a starting user of PHP scripting really needs: The lines to be used in a HTML page, where the result of the script will be visible:

<?php
$sourcefile
= "ORIGFILE.jpg";
$insertfile = "watermark.jpg";
$targetfile = "foto.jpg";
$transition = 30;
$pos=7;
require(
"watermark.php");
mergePix($sourcefile, $insertfile, $targetfile, $pos, $transition);
echo
"<img src=\"$targetfile\">";
?>

I was so lucky to get these lines from someone on the internet, after I posted my question all over the world.
Most other people that replied, referred to the bookstore. But I had first read halve the (this) PHP manual, and had not found it.

Just a suggestion, but I know it will help many people getting started with PHP: When you put your scripts here, why not add those few lines needed to incorporate it into a HTML page?
jtacon at php dot net
14-Dec-2004 07:36
This example shows how to use imageCopyMerge to create a water mark function with four random positions (the corners).

<?php
function waterMark($fileInHD, $wmFile, $transparency = 50, $jpegQuality = 90, $margin = 5) {

 
$wmImg  = imageCreateFromGIF($wmFile);
 
$jpegImg = imageCreateFromJPEG($fileInHD);

 
// Water mark random position
 
$wmX = (bool)rand(0,1) ? $margin : (imageSX($jpegImg) - imageSX($wmImg)) - $margin;
 
$wmY = (bool)rand(0,1) ? $margin : (imageSY($jpegImg) - imageSY($wmImg)) - $margin;

 
// Water mark process
 
imageCopyMerge($jpegImg, $wmImg, $wmX, $wmY, 0, 0, imageSX($wmImg), imageSY($wmImg), $transparency);

 
// Overwriting image
 
ImageJPEG($jpegImg, $fileInHD, $jpegQuality);
}

waterMark('myImage.jpg','waterMark.gif');

?>

HTH.

Javier Tacón.
claudio dot gaetani at gdldesign dot it
09-May-2004 01:04
This function is intended to serve as an example for the "imageCopyMerge"-"ImageCopyResized", "ImageColorTransparent" functions.
I hope it will help.
This function pick an image, square cut it resampled at the size requested and finishing merge the result with another one to obtain a circular image result. I have a problem to obtain an thumbnail that respect the colors and at the same time where cutted in a circular form, I hope this solution can gives you a clue to obtain a free form images, I use this one also to create multicutted images.

<?php
$generalsrc
="$image"; //the image to resample, resize and iconaize
$final_thumbwidth ="125";
$final_thumbheight ="125";

$abc = imagecreatefromjpeg("$generalsrc");
$def = imagecreatetruecolor($final_thumbwidth, $final_thumbheight);
$src_mx = round((imagesx($abc) / 2)-"0.1"); // middle x point of the image
$src_my = round((imagesy($abc) / 2)-"0.1"); // middle y point of the image
$src_x = ($src_mx * 2);
$src_y = ($src_my * 2);
$src_sq = ($src_x >= $src_y)?$src_y:$src_x; //used to define the best size for a square cut of the image
$pl = ($src_x >= $src_y)?"1":"2"; //define if the image is portait or landscape
$strt_pntx = ($pl=="1")?round(($src_my / 2)-"0. 1"):"0"//defines the x start point
$strt_pnty = ($pl=="2")?round(($src_mx / 2)-"0. 1"):"0"//defines the y start point

imagecopyresized($def, $abc, 0, 0, $strt_pntx, $strt_pnty, $final_thumbwidth, $final_thumbheight, $src_sq, $src_sq);

$overlay_img = imagecreatefromPNG("circle_125.png"); //NOTE use png for this
$src_w = "ImageSX($overlay_img)";
$src_h  = "ImageSY($overlay_img)";

$can_img = imagecreatetruecolor($src_w, $src_h);

$black = ImageColorAllocate ($overlay_img, 0, 0, 0);

ImageColorTransparent($overlay_img , $black);

imagecopy($can_img, $def, 0,0,0,0, $src_w, $src_h);
imagecopymerge($can_img, $overlay_img , 0,0,0,0, ImageSX($overlay_img), ImageSY($overlay_img),100); //Imagecopy won't work, you must used imagecopymerge

ImageJPEG($can_img,"merge_$generalsrc",100);

imagedestroy($overlay_img);
imagedestroy($can_img);
ImageDestroy($abc);
ImageDestroy($def);

print
"<HTML><HEAD><TITLE>test</TITLE></HEAD><BODY>
original:<hr><img src=\"
$generalsrc\" width=\"300\"><br><br><br>new:<hr><img src=\"merge_$generalsrc\">
<br>width =
$src_x
<br>height =
$src_y
<br>mdlw =
$src_mx
<br>mdlh =
$src_my
<br>sqr =
$src_sq
<br>pl =
$pl
<br>start point x =
$strt_pntx
<br>start point y =
$strt_pnty
</BODY></HTML>"
;
?>
bjorn AT smokingmedia DOT com
26-May-2003 01:10
in addition to stefan's posting:

i found that if you use imagecopymerge with png-24 files with an alpha channel, it doesn't work use imagecopy instead.
it seems that imagecopymerge doesn't respect the alpha channel the way it should (a bug??).

some sample code here to place an image (image.png) on a backgroundcolor or backgroundimage.

<?php

$im
= "image.png";
$bg = "ffddee";    // hex representation of the color (i.e. #ffffff for white)
$out = "png";      // or "jpg" for jpg file output
// $backgroundfile = "";  // optional backgroundfile if you don't want to use a color

//
// function to convert hex colorcode to decimal
//

function colordecode($hex){

  
$code[r] = hexdec(substr($hex, 0 ,2));
  
$code[g] = hexdec(substr($hex, 2 ,2));
  
$code[b] = hexdec(substr($hex, 4 ,2));

   return
$code;

}
// end func colordecode

// create the resource id
$image_id = imageCreateFromPNG($im);

// get image size
$im_X = ImageSX($image_id);
$im_Y = ImageSY($image_id);

// create a truecolor background image of the right size
// or use a background image like this
// $backgroundimage = imageCreateFromPNG($backgroundfile);
$backgroundimage = imagecreatetruecolor($im_X, $im_Y);

// get the desired backgroundcolor:
// don't use this if you want to use a background image
$code = colordecode($bg);
$backgroundcolor = ImageColorAllocate($backgroundimage, $code[r], $code[g], $code[b]);
ImageFilledRectangle($backgroundimage, 0, 0, $im_X, $im_Y, $backgroundcolor);

// merge the two together with alphablending on!
ImageAlphaBlending($backgroundimage, true);
imagecopy($backgroundimage, $image_id, 0, 0, 0, 0, $im_X, $im_Y);

// output the image:
if($output == "jpg"){
  
Header( "Content-type: image/jpeg");
  
ImageJPEG($backgroundimage);
   }
   else{
      
Header( "Content-type: image/png");
      
ImagePNG($backgroundimage);
       }

// destroy the memory
ImageDestroy($backgroundimage);
ImageDestroy($image_id);
?>
feisty at feistyenterprises dot com
06-Nov-2002 02:15
Yep, that worked a charm.

Since imageCopyMergeGray() is identical, it works just as well for that.

If you want to convert an image to greyscale, use imageCopyMergeGray() with the same image as source and destination, set the pict to 0, et voila!
jonny at sanriowasteland dot net
29-Sep-2002 07:36
If you need to merge 2 png's (or  presumably 2 gifs) with different color palettes, I have found this is the function to use.  Just set pct to 99, and you are rocking.  With pct set to 100, or imagecopy for that matter, the palette seems to go wonky.  (It probably just uses the palette of the source image. but don't quote me on that).
stefan dot wehowsky at profilschmiede dot de
26-Jul-2001 11:32
This function is intended to serve as an example for the "imageCopyMerge"-function.
I hope it will help some of the less experienced php-coders here.
I wrote it to mark objects of a real estate broker as "sold" by copying the "sold"-picture right into the picture of the house.

<?php

//$sourcefile = Filename of the picture into that $insertfile will be inserted.
//$insertfile = Filename of the picture that is to be inserted into $sourcefile.
//$targetfile = Filename of the modified picture.
//$transition = Intensity of the transition (in percent)
//$pos          = Position where $insertfile will be inserted in $sourcefile
//                0 = middle
//                1 = top left
//                2 = top right
//                3 = bottom right
//                4 = bottom left
//                5 = top middle
//                6 = middle right
//                7 = bottom middle
//                8 = middle left
//
//
function mergePix($sourcefile,$insertfile, $targetfile, $pos=0,$transition=50)
{
  
//Get the resource id´s of the pictures
  
$insertfile_id = imageCreateFromJPEG($insertfile);
  
$sourcefile_id = imageCreateFromJPEG($sourcefile);

//Get the sizes of both pix   
  
$sourcefile_width=imageSX($sourcefile_id);
  
$sourcefile_height=imageSY($sourcefile_id);
  
$insertfile_width=imageSX($insertfile_id);
  
$insertfile_height=imageSY($insertfile_id);

//middle
  
if( $pos == 0 )
   {
      
$dest_x = ( $sourcefile_width / 2 ) - ( $insertfile_width / 2 );
      
$dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
   }

//top left
  
if( $pos == 1 )
   {
      
$dest_x = 0;
      
$dest_y = 0;
   }

//top right
  
if( $pos == 2 )
   {
      
$dest_x = $sourcefile_width - $insertfile_width;
      
$dest_y = 0;
   }

//bottom right
  
if( $pos == 3 )
   {
      
$dest_x = $sourcefile_width - $insertfile_width;
      
$dest_y = $sourcefile_height - $insertfile_height;
   }

//bottom left   
  
if( $pos == 4 )
   {
      
$dest_x = 0;
      
$dest_y = $sourcefile_height - $insertfile_height;
   }

//top middle
  
if( $pos == 5 )
   {
      
$dest_x = ( ( $sourcefile_width - $insertfile_width ) / 2 );
      
$dest_y = 0;
   }

//middle right
  
if( $pos == 6 )
   {
      
$dest_x = $sourcefile_width - $insertfile_width;
      
$dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
   }
      
//bottom middle   
  
if( $pos == 7 )
   {
      
$dest_x = ( ( $sourcefile_width - $insertfile_width ) / 2 );
      
$dest_y = $sourcefile_height - $insertfile_height;
   }

//middle left
  
if( $pos == 8 )
   {
      
$dest_x = 0;
      
$dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
   }
  
//The main thing : merge the two pix   
  
imageCopyMerge($sourcefile_id, $insertfile_id,$dest_x,$dest_y,0,0,$insertfile_width,$insertfile_height,$transition);

//Create a jpeg out of the modified picture
  
imagejpeg ($sourcefile_id,"$targetfile");
  
}

<imagecopyimagecopymergegray>
 Last updated: Thu, 19 May 2005
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: The Server Pages
Last updated: Thu May 19 17:35:34 2005 CDT