3

我正在尝试将 jpeg 放在 png 后面 - png 具有 alpha 透明度。

前景图片在这里: http: //peugeot208.srv.good-morning.no/images/marker-shadow.png

后面的图片是 Facebook 个人资料图片 - 通常是这样的: https ://graph.facebook.com/100000515495823/picture

结果图像失去透明度,而是黑色:http: //peugeot208.srv.good-morning.no/libraries/cache/test.png

这是我使用的代码:

// combine image with shadow
$newCanvas = imagecreatetruecolor(90,135);
$shadow = imagecreatefrompng("marker-shadow.png");  

//imagealphablending($newCanvas, false);
imagesavealpha($newCanvas, true);   

imagecopy($newCanvas, $canvas, 20, 23, 0, 0, 50, 50);
imagecopy($newCanvas, $shadow, 0, 0, 0, 0, 90, 135);
imagepng($newCanvas, $tempfile, floor($quality * 0.09));

如果我启用 imagealphablending($newCanvas, false);,结果是正确的(标记中间的孔是透明的)但是后面的图像消失了。

你能解释一下吗?:-)

谢谢!

编辑:找到解决方案

我做了一些摆弄,最终得到了这段代码——原点不是createimagetruecolor,而是从模板创建的图像——这是一个透明的png。

现在它可以工作了 - 结果是正确透明的。我真的不知道为什么。知道为什么吗?

fbimage.php

// Create markerIcon 
$src = $_REQUEST['fbid'];

$base_image = imagecreatefrompng("../images/marker-template.png");
$photo = imagecreatefromjpeg("https://graph.facebook.com/".$src."/picture");
$top_image = imagecreatefrompng("../images/marker-shadow.png");

imagesavealpha($base_image, true);
imagealphablending($base_image, true);

imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);
imagepng($base_image, "./cache/".$src.".png");

?>

<img src="./cache/<?php echo $src ?>.png" />

更新:检查以下代码 您可以在这里找到结果:http: //peugeot208.srv.good-morning.no/images/marker.php 如您所见,背景仍然是黑色的。

// create base image
$base_image = imagecreatetruecolor(90,135);
$photo = imagecreatefromjpeg("marker-original.jpg");
$top_image = imagecreatefrompng("marker-shadow.png");

imagesavealpha($top_image, true);
imagealphablending($top_image, true);

imagesavealpha($base_image, true);
imagealphablending($base_image, true);

// merge images
imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);

// return file
header('Content-Type: image/png');
imagepng($base_image);
4

5 回答 5

5

解决方案是将颜色分配为 100 % alpha 透明,然后在基础图像的整个画布上绘制一个正方形:

// create base image
$base_image = imagecreatetruecolor(90,135);

// make $base_image transparent
imagealphablending($base_image, false);
$col=imagecolorallocatealpha($base_image,255,255,255,127);
imagefilledrectangle($base_image,0,0,90,135,$col);
imagealphablending($base_image,true);    
imagesavealpha($base_image, true);
// --- 

$photo = imagecreatefromjpeg("marker-original.jpg");
$top_image = imagecreatefrompng("marker-shadow.png");

// merge images
imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);

// return file
header('Content-Type: image/png');
imagepng($base_image);
于 2012-03-27T10:58:56.080 回答
1

运行以下 php 脚本并查看该数组集上可用的天气 https。

    回声“<pre>”;
    print_r(stream_get_wrappers());
    回声“</pre>”;

输出会是这样。

    大批
    (
        [0] => php
        [1] => 文件
        [2] => 全局
        [3] => 数据
        [4] => http
        [5] => ftp
        [6] => 拉链
        [7] => 压缩.zlib
        [8] => https
        [9] => FTP
        [10] => 压缩.bzip2
        [11] => 法尔
    )

这里数组元素 8th 显示 https 已启用。如果那在您的代码上不可用,那么。找到 php.ini 文件并将下面的行放在那里。

扩展=php_openssl.dll

重新启动服务器之后,您的函数甚至可以使用 facebook 资源 url。

于 2012-03-24T03:35:05.970 回答
0

挣扎了一段时间,这里的答案都没有完全帮助我。以下是尝试在透明 PNG 上添加 JPG 时完美运行的代码(注意“// !!! * ”注释,它们很重要):

// create a true colour, transparent image
// turn blending OFF and draw a background rectangle in our transparent colour 
$image=imagecreatetruecolor($iwidth,$iheight);
imagealphablending($image,false);
$col=imagecolorallocatealpha($image,255,255,255,127);

imagefilledrectangle($image,0,0,$iwidth,$iheight,$col);
imagealphablending($image,true);
// ^^ Alpha blanding is back on.

// !!! *** IMAGE MANIPULATION STUFF BELOW ***

$backImage = imagecreatefrompng("yourimage.png");
imagecopyresampled($image, $backImage, 0, 0, 0, 0, 400, 300, 400, 300);
$foreImage = imagecreatefromjpeg("yourimage.png");
imagecopyresampled($image, $foreImage, 10, 10, 0, 0, 200, 150, 200, 150);

// !!! *** IMAGE MANIPULATION STUFF ABOVE ***

// output the results... 
header("Content-Type: image/png;");
imagealphablending($image,false);
imagesavealpha($image,true);
imagepng($image);

学分: http: //www.bl0g.co.uk/creating-transparent-png-images-in-gd.html

于 2012-10-31T19:44:33.477 回答
0
// create base image
$photo = imagecreatefromjpeg("Penguins.jpg");
$frame = imagecreatefrompng("frame.png");

// get frame dimentions
$frame_width = imagesx($frame);
$frame_height = imagesy($frame);

// get photo dimentions
$photo_width = imagesx($photo);
$photo_height = imagesy($photo);

// creating canvas of the same dimentions as of frame
$canvas = imagecreatetruecolor($frame_width,$frame_height);

// make $canvas transparent
imagealphablending($canvas, false);
$col=imagecolorallocatealpha($canvas,255,255,255,127);
imagefilledrectangle($canvas,0,0,$frame_width,$frame_height,$col);
imagealphablending($canvas,true);    
imagesavealpha($canvas, true);

// merge photo with frame and paste on canvas
imagecopyresized($canvas, $photo, 0, 0, 0, 0, $frame_width, $frame_height,$photo_width, $photo_height); // resize photo to fit in frame
imagecopy($canvas, $frame, 0, 0, 0, 0, $frame_width, $frame_height);

// return file
header('Content-Type: image/png');
imagepng($canvas);

// destroy images to free alocated memory
imagedestroy($photo);
imagedestroy($frame);
imagedestroy($canvas);
于 2013-03-26T06:40:04.383 回答
0

我尝试以下代码,它对我很有效。

    $宽度 = 400;
    $高度 = 400;

    $base_image = imagecreatefromjpeg("base.jpg");
    $top_image = imagecreatefrompng("top.png");

    图像保存阿尔法($top_image,假);
    imagealphablending($top_image, false);
    imagecopy($base_image, $top_image, 0, 0, 0, 0, $width, $height);
    imagepng($base_image, "merged.png");


我检查了第一个脚本。对于所有透明 png,您必须应用以下代码。

图像保存阿尔法($阴影,真);imagealphablending($shadow, true);

否则将有黑色填充物。在这里,您没有将其应用于“marker-shadow.png”文件对象

于 2012-03-23T16:05:03.433 回答