PHP GD和透明图像有时可以正常工作

时间:2015-05-29 19:34:40

标签: php gd

在阅读在PHP中合并透明图像的问题时,似乎每个人都在"它的工作原理"或者"它没有工作"营。我找到了一种方法来证明每个案例。

我想拍一张PNG,在其中剪切一个ALPHA洞,然后将其合并到另一张图像上。在这种情况下,我在谷歌地图上的图像中剪了一个洞,并将其粘贴在红色块上。我有来自谷歌地图的两张图片。一个是曼哈顿,一个是我家。一个工作,一个不工作。唯一的区别是一个被保存了#34;通过浏览器。

如果您运行下面的代码,您将看到输出的差异。有谁知道为什么相同的代码会完全不同地处理两个PNG文件?它必须是PNG文件本身的差异,但那会是什么?

<?php
sometimesworks("https://maps.googleapis.com/maps/api/staticmap?center=40.714728,-73.998672&zoom=12&size=400x400&maptype=hybrid", "google");
sometimesworks("https://lh4.googleusercontent.com/UQvV_dpBa3_rVf25pvLXKD3OwzF4FtPnHBHkzdWqjCQ5mlFqcFfId9echIgDMv_xYRRYzLaKEXphw7g=w2447-h1106", "myhouse");

function sometimesworks($p_image, $p_prefix)
{
$image_top =imagecreatefrompng($p_image);
$brush = imagecolorallocate($image_top, 0, 0, 0);  //create a black brush
imagefilledpolygon($image_top, explode(",", "10,10, 120,22, 80,280, 200, 191"), 4, $brush);  //fill a polygon
imagecolortransparent($image_top, $brush);  //turn the black to be transparent
imagepng($image_top, './'.$p_prefix.'.transparent.png');  //save the file to confirm that it is working.

//create a big red square
$image_bottom = imagecreatetruecolor(imagesx($image_top), imagesy($image_top));
$red = imagecolorallocate($image_bottom, 255, 0, 0);
imagefill($image_bottom, 0, 0, $red);
imagepng($image_bottom, './'.$p_prefix.'.red.png');

//merge the top onto the bottom.
$out = imagecreatetruecolor(imagesx($image_top), imagesy($image_top));
imagecopy($out, $image_bottom, 0, 0, 0, 0, imagesx($image_top), imagesy($image_top));
imagecopy($out, $image_top, 0, 0, 0, 0, imagesx($image_top), imagesy($image_top));
imagepng($out, './'.$p_prefix.'.out.png');
}

1 个答案:

答案 0 :(得分:0)

上述代码的问题是PNG文件属于不同类型。一个是真彩色图像,另一个是调色板。合并文件的代码根据正在进行的操作而有所不同。

这是合并&#34; palette&#34;的一个很好的参考。基于透明度的PNG文件。