2012-03-23 13 views
3

pngの後ろにjpegを配置しようとしています。PHPアルファ透明度を持つpngの上にjpegをマージする

前景画像はこちら: 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)を有効にすると、結果は正しい(マーカーの中央の穴は透明ですが)後ろの画像はなくなります。

あなたはこれに光を当てることができますか? :-)

ありがとう!

編集:実測ソリューション

私はいくつかのあいをして、このコードになってしまった - 透過PNGである - 起源はcreateimagetruecolorが、テンプレートから作成した画像ではありません。

これはうまくいきました。結果は適切に透明です。私はなぜそれが本当にわからない。なぜアイディアがあるの?

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); 
+0

$ canvasイメージでもアルファベットを有効にしていることを確認してください。 –

+0

Halfer。私は皮肉に見えることを意味しませんでした:-)私は以前の質問でいくつかの方向性が必要です。私は合計で6つの質問をしました。 1つは答えられなかった。削除されました。この質問に答えてください:806133.最も合理的な答えは私のものですが、それは回避策です。私自身の答えを受け入れるべきですか?または他の誰かが十分な答えではありませんか? – nitech

答えて

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); 
+1

+1私の問題を解決したので – Blizz

+0

私のためにこれを解決したのは、8行目のimagealphablending($ base_image、true);でした。それは透明層の後に来ました。ありがとう。 – Robbie

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"ファイルオブジェクトには適用されません

+0

imagecreatetruecolor(..)を実行して、新しい画像キャンバスを作成しようとすると何らかの理由でこれが機能しません - bgはまだ黒です。 – nitech

+0

あなたのコード(fbimage.php)が正常に動作しているかどうかを確認します。 https urlからfacebook thumをロードしている問題のみです。動作させるには、php.iniファイルでhttps wrapersを有効にする必要があります。しかし、ローカルファイルの場合は正常に動作しています。私はhttpsラッパーを有効にする指示を別の答えとして付けます。 – sugunan

+0

はい - fbimage.phpも私と一緒に動作します。 fbimage.phpと私が投稿した最初のコードとの違いは、最初のコードはimagecreatetruecolorをベースキャンバスとして使用し、fbimage.phpはimagecreatefrompngのテンプレートとしてpngを使用することです。 imagecreatetruecolorオブジェクトに適用する必要があるコードはありますか?pngテンプレートと同じように動作しますか? – nitech

1

次のPHPスクリプトを実行し、そのアレイセットで利用可能な天気httpsを表示します。

 

    echo "<pre>"; 
    print_r(stream_get_wrappers()); 
    echo "</pre>"; 

出力はこのようになります。

 

    Array 
    (
     [0] => php 
     [1] => file 
     [2] => glob 
     [3] => data 
     [4] => http 
     [5] => ftp 
     [6] => zip 
     [7] => compress.zlib 
     [8] => https 
     [9] => ftps 
     [10] => compress.bzip2 
     [11] => phar 
    ) 

ここで、配列要素8は、httpsが有効であることを示します。それがあなたのコードで利用できない場合。 php.iniファイルを探し、そこに次の行を置きます。その再起動サーバの後

拡張子= php_openssl.dll

その後、あなたの関数であっても、FacebookのリソースURLで動作します。

+0

のためにそれを適用していないそれは得られた以下: アレイ ( [0] => HTTPS [1] => [2] =>圧縮FTPS。 ZLIB [3] => compress.bzip2 [4] => PHP [5] => [8] => HTTP [6] =>グロブ [7] =>データ ファイル[9] = > ftp [>] phar [>] zip ) – nitech

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

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); 
関連する問題