0

ウェブサイトにアップロードした直後に画像に透かしを追加しようとしていますが、透かしが詳細のない黒いオブジェクトとして表示され続けるようです。スクリプトは少しは機能していると思います。そうでなければ、透かしが表示されなかったり、スクリプトが失敗したりするからです。

これまでの私のスクリプトは次のとおりです。

$watermark = imagecreatefrompng('preview-watermark.png');  
$watermark_width = imagesx($watermark);  
$watermark_height = imagesy($watermark);        
$image = imagecreatetruecolor($watermark_width, $watermark_height);  
$image = imagecreatefromjpeg($portfolio_preview_dir.'/'.$file);  
$size = getimagesize($portfolio_preview_dir.'/'.$file);  
$dest_x = $size[0] - $watermark_width - 5;  
$dest_y = $size[1] - $watermark_height - 5;  
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);  
imagejpeg($image, $portfolio_preview_dir.'/'.$file);  
imagedestroy($image); 
imagedestroy($watermark);

制作しているのはこれです。透かしは 325x37 ピクセルであるため、透かしの形状は正しいです。

ここに画像の説明を入力

透かし画像自体で遊んでみました。私の最初の試みは、「ウェブ用に保存」を使用して「PNG-24」を選択して、フォトショップの透かしを(透明な背景で)保存することでした。これはうまくいかなかったので、通常のPNGとして保存しました(「Web用に保存」なし)が、それでも失敗します。

台本なのか画像なのかよくわからない!誰かが私と知識を共有して、この問題を解決するのを手伝ってくれませんか?

4

2 に答える 2

1
$watermark = imagecreatefrompng('preview-watermark.png');
imagealphablending($watermark , false);
imagesavealpha($watermark , true);
$watermark_width = imagesx($watermark);  
$watermark_height = imagesy($watermark);        
$image = imagecreatetruecolor($watermark_width, $watermark_height);  
$image = imagecreatefromjpeg($portfolio_preview_dir.'/'.$file);  
$size = getimagesize($portfolio_preview_dir.'/'.$file);  
$dest_x = $size[0] - $watermark_width - 5;  
$dest_y = $size[1] - $watermark_height - 5;  
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);  
imagejpeg($image, $portfolio_preview_dir.'/'.$file);  
imagedestroy($image); 
imagedestroy($watermark);

ものがあります:

  1. imagecopymerge は PNG-24 の透過性を許可しません

(出典: https://drupal.org/node/80369 )

  1. imagesavealpha + imagealphablending で透明度を保存できます

(ソース: http://php.net/manual/en/function.imagesavealpha.php )

問題が解決することを願っています。

また、JPEGを出力しますが、なぜですか?PNG のままにしておくと、画像は透明な透かしをサポートしますが、現在はサポートしていません!

于 2013-08-07T17:10:10.903 に答える
0

SOとphp.netにも多くのソリューションがあります。これは1つです(新しいイメージ自体を作成せずに)

// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');

// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);

編集

透かしは、アルファ チャンネル (透明度) で保存する必要があります。CS2以降のPhotoshop(Web用に保存)はこれを行う必要があり、GIMPもうまく機能します.

于 2013-08-07T17:03:13.657 に答える