imagealphablending

(PHP 4 >= 4.0.6, PHP 5)

imagealphablending -- 设定图像的混色模式

说明

bool imagealphablending ( resource image, bool blendmode )

imagealphablending() 允许在真彩色图像上使用两种不同的绘画模式。在混色(blending)模式下,alpha 通道色彩成分提供给所有的绘画函数,例如 imagesetpixel() 决定底层的颜色应在何种程度上被允许照射透过。作为结果,GD 自动将该点现有的颜色和画笔颜色混合,并将结果储存在图像中。结果的像素是不透明的。在非混色模式下,画笔颜色连同其 alpha 通道信息一起被拷贝,替换掉目标像素。混色模式在画调色板图像时不可用。如果 blendmodeTRUE,则启用混色模式,否则关闭。如果成功则返回 TRUE,失败则返回 FALSE

注: 本函数需要 GD 2.0.1 或更高版本。


add a note add a note User Contributed Notes
Raisul Kabir Ruman
01-Sep-2006 08:45
In the previous message, I found it is working perfect. But, it can be done a lot easily, as is described by the first message by "barnabas at kendall dot NOSPAM dot net". Though, it don't work totally, instead of using imageAlphaBlending, you have to use imageSaveAlpha

So, I found the corrected and smalled code would be

<?php
$im_a
= @imagecreatefrompng("a.png");
$im_c = @imagecreatefrompng("c.png");
imageSaveAlpha($im_c, true);

imagecopy($im_c,$im_a,0,0,0,0,200,200);
header("Content-type: image/png");
imagepng($im_c);
?>
luke dot stanley at gmail dot com
22-Aug-2006 04:30
"If imagealphablending os set to true and you want to merge two images, you are left with no transparency. If it is set to false, only the transparency of the second image is respected, causing no parts of the first image to be shown. To solve this use the following function:"

dscharrer at gmail dot com offered this without a use example, so here is one:

<?

$flag
= imagecreatefrompng('a.png');
$mask = imagecreatefrompng('b.png');

imagealphablending($flag, 1);
imagealphablending($mask, 1);
$i= array($flag, $mask); // here is the array of images, using the above specified $flag and $mask images

$s = imagemergealpha($i);

header("Content-type: image/png");
imagepng($s);

//Merge multiple images and keep transparency

//$i is and array of the images to be merged:
// $i[1] will be overlayed over $i[0]
// $i[2] will be overlayed over that
// ...

//the function returns the resulting image ready for saving

function imagemergealpha($i) {

 
//create a new image
 
$s = imagecreatetruecolor(imagesx($i[0]),imagesy($i[1]));
 
 
//merge all images
 
imagealphablending($s,true);
 
$z = $i;
 while(
$d = each($z)) {
 
imagecopy($s,$d[1],0,0,0,0,imagesx($d[1]),imagesy($d[1]));
 }
 
 
//restore the transparency
 
imagealphablending($s,false);
 
$w = imagesx($s);
 
$h = imagesy($s);
 for(
$x=0;$x<$w;$x++) {
  for(
$y=0;$y<$h;$y++) {
  
$c = imagecolorat($s,$x,$y);
  
$c = imagecolorsforindex($s,$c);
  
$z = $i;
  
$t = 0;
   while(
$d = each($z)) {
  
$ta = imagecolorat($d[1],$x,$y);
  
$ta = imagecolorsforindex($d[1],$ta);
  
$t += 127-$ta['alpha'];
   }
  
$t = ($t > 127) ? 127 : $t;
  
$t = 127-$t;
  
$c = imagecolorallocatealpha($s,$c['red'],$c['green'],$c['blue'],$t);
  
imagesetpixel($s,$x,$y,$c);
  }
 }
 
imagesavealpha($s,true);
 return
$s;
}

?>
ashita at profund dot hu
05-Oct-2005 05:41
For "webmaster at nweurosport dot com" :

Currently IE does not support 24 (+8 alpha) bit PNG-s (nor any kind of transparent images). Mozilla and Opera handle them correctly.
Jakub Argasiski
06-Jun-2005 02:53
I have been looking around for a while to find a script which does the following: generates image with text using specified font with given color, but with totally transparent background (by alpha-channnel, not via color transparency). Finally, I have created the script by myself. It's just a rough idea how to do it.

<?php
$tekst
= "This is a test message\nza gl ja!\nZA GL JA?";

$h = 9;

$size = imageTTFBBox($h, 0, "arial.ttf", $tekst);
$image = imageCreateTrueColor(abs($size[2]) + abs($size[0]), abs($size[7]) + abs($size[1]));
imageSaveAlpha($image, true);
ImageAlphaBlending($image, false);

$tlo = imagecolorallocatealpha($image, 220, 220, 220, 127);
imagefill($image, 0, 0, $tlo);

$napis = imagecolorallocate($image, 220, 220, 220);
imagettftext($image, $h, 0, 0, abs($size[5]), $napis, "arial.ttf", $tekst);
imagepng($image, "output.png");
imagedestroy($image);

?>
<html>
<head>
</head>
<body bgcolor="#808080">
<img src="output.png" alt="">
</body>
</html>
webmaster at nweurosport dot com
18-Feb-2005 05:00
When saving images for use in transparent overlays like the logo addition mentioned above I've found that it is not succesful with PNG-24, only GIF and PNG-8.  I've had great success with PNG-8's.
dscharrer at gmail dot com
24-Dec-2004 06:32
If imagealphablending os set to true and you want to merge two images, you are left with no transparency. If it is set to false, only the transparency of the second image is respected, causing no parts of the first image to be shown. To solve this use the following function:

<?
//Merge multiple images and keep transparency

//$i is and array of the images to be merged:
// $i[1] will be overlayed over $i[0]
// $i[2] will be overlayed over that
// ...

//the function returns the resulting image ready for saving

function imagemergealpha($i) {

 
//create a new image
 
$s = imagecreatetruecolor(imagesx($i[0]),imagesy($i[1]));
 
 
//merge all images
 
imagealphablending($s,true);
 
$z = $i;
 while(
$d = each($z)) {
 
imagecopy($s,$d[1],0,0,0,0,imagesx($d[1]),imagesy($d[1]));
 }
 
 
//restore the transparency
 
imagealphablending($s,false);
 
$w = imagesx($s);
 
$h = imagesy($s);
 for(
$x=0;$x<$w;$x++) {
  for(
$y=0;$y<$h;$y++) {
  
$c = imagecolorat($s,$x,$y);
  
$c = imagecolorsforindex($s,$c);
  
$z = $i;
  
$t = 0;
   while(
$d = each($z)) {
  
$ta = imagecolorat($d[1],$x,$y);
  
$ta = imagecolorsforindex($d[1],$ta);
  
$t += 127-$ta['alpha'];
   }
  
$t = ($t > 127) ? 127 : $t;
  
$t = 127-$t;
  
$c = imagecolorallocatealpha($s,$c['red'],$c['green'],$c['blue'],$t);
  
imagesetpixel($s,$x,$y,$c);
  }
 }
 
imagesavealpha($s,true);
 return
$s;
}
?>
joe AT cerberon DOT net
02-Mar-2004 09:02
Note that alpha blending must be enabled to render antialiased text in true color mode.

For OLDER versions of PHP and/or GD (e.g. which comes with Debian woody) alpha blending is DISABLED by default and it is ENABLED for NEWER versions.
www.deebster.com
17-Nov-2003 07:12
Your target image resource not must be paletted if you want to use blending.

This means using ImageCreateTrueColor() rather than ImageCreate().

(If your source is e.g. a jpeg and you've used ImageCreateFromJPEG(), the above is irrelevant.)
boo at php dot net
30-Jun-2003 05:18
Notice that AlphaBlending is ON by default.
So, only use this function if you don't want to use AlphaBlending.
tcarter at roundcorners dot com
13-Feb-2002 11:55
If you are saving an image as PNG with transparency then saving it as a PNG-8 will give it transparency in the same way GIF has, but that won't work with this function.

For this function to work the image needs to have an alpha channel (obviously really when you think about it), so make sure you save as PNG-24
barnabas at kendall dot NOSPAM dot net
12-Oct-2001 08:56
If you are trying to copy a transparant image on to another image, you might assume that you should apply the ImageAlphaBlending function to the image that has the transparancy, the source image. In reality, you must apply the ImageAlphaBlending function to the destination image. Basically it's saying, "make the specified image respect transparancy".

Here's a real world example. Suppose you want to put your logo on the upper left corner of a photograph. Your logo is a PNG with transparancy, and the photo is a JPEG. Here's what you would do:

<?php
$photoImage
= ImageCreateFromJPEG('photo.jpg');
ImageAlphaBlending($photoImage, true);

$logoImage = ImageCreateFromPNG('logo.png');
$logoW = ImageSX($logoImage);
$logoH = ImageSY($logoImage);

ImageCopy($photoImage, $logoImage, 0, 0, 0, 0, $logoW, $logoH);

ImageJPEG($photoImage); // output to browser

ImageDestroy($photoImage);
ImageDestroy($logoImage);
?>