3

pngの後ろにjpegを配置しようとしています-pngはアルファ透明度を持っています。

前景の画像はここにあります: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%アルファ透明として色を割り当ててから、ベース画像のキャンバス全体に正方形を描画することでした。

// 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] => zip
        [7] => compress.zlib
        [8] => https
        [9] => ftps
        [10] => compress.bzip2
        [11]=>ファー
    )。

ここで、配列要素8は、httpsが有効になっていることを示しています。それがあなたのコードで利用できない場合は、php.iniファイルを見つけて、そこに次の行を配置します。

extension = php_openssl.dll

その後、サーバーを再起動すると、関数はFacebookリソースのURLでも機能します。

于 2012-03-24T03:35:05.970 に答える
0

私はそれが私のためにうまくいく次のコードを試します。

    $ width = 400;
    $ height = 400;

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

    imagesavealpha($ top_image、false);
    imagealphablending($ top_image、false);
    imagecopy($ base_image、$ top_image、0、0、0、0、$ width、$ height);
    imagepng($ base_image、 "merged.png");


最初のスクリプトを確認します。すべての透明なpngには、次のコードを適用する必要があります。

imagesavealpha($ shadow、true); imagealphablending($ shadow、true);

そうでなければ、黒い色の詰め物がそこにあります。ここでは、「marker-shadow.png」ファイルオブジェクトには適用しませんでした

于 2012-03-23T16:05:03.433 に答える
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 に答える