5

これは何度も取り上げられていることは知っていますが、さまざまなスクリプトを試して、持っているスクリプトを変更し続けていますが、PNG-24 watermark.png を親画像の上に透明にすることはできません。

これは私が現在持っているものです:

<?

header('content-type: image/jpeg');

$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);

$image = imagecreatefromjpeg($imageURL);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$size = getimagesize($imageURL);

imagealphablending($image, false);
imagesavealpha($image, true);

$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);

imagedestroy($image);
imagedestroy($watermark);

?>

別のSOの質問を読んだところですが、回答の1つは、次の2行を追加しないと透明にならないとアドバイスしています。

imagealphablending($image, false);
imagesavealpha($image, true);

私はそれらを追加しましたが、まだ追加していません。代わりにヘッダーと出力を PNG に設定しようとしましたが、まだ運がありません。透かしをブラウザ(生)にロードしましたが、それは間違いなく透明ですが、画像にはありません。確かにこれは難しいことではありませんか?私が間違っていることはありますか?

4

1 に答える 1

17

これはアプリケーション コードの問題ではなく、透かし画像 (PNG) 自体の問題です。

多くの透かしの例/チュートリアルでは、PNG-24 透かしを使用するように言われていますが、私が読んだばかりのブログによると、imagecopymergePNG-24 ファイルをうまく処理できないため、PNG-8 といくつかの特別な透かしを使用してください。 「Web 用に保存」設定。私はこれを行いましたが、現在は正常に動作しています。

このブログの PNG タイプに関する関連セクションは次のとおりです。

透かし画像は、次の推奨形式のいずれかである必要があります。

  • PNG-8 (推奨)
    色: 256 以下
    透明度: オン/オフ
  • GIF
    色: 256 色以下
    透明度: オン/オフ
  • JPEG
    色: トゥルーカラー
    透過性: 該当なし

imagecopymerge 関数は、PNG-24 イメージを適切に処理しません。したがって、推奨されません。

Adobe Photoshop を使用して透かし画像を作成している場合は、次の設定で [Web 用に保存] コマンドを使用することをお勧めします。

File Format: PNG-8, non-interlaced
Color Reduction: Selective, 256 colors
Dithering: Diffusion, 88%
Transparency: On, Matte: None
Transparency Dither: Diffusion Transparency Dither, 100%

そして、他の人の利益のために、これは私が持っている透かしコードです:

<?
$masterURL = 'mydomain.com/myImage.jpg';

header('content-type: image/jpeg');
$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$image = imagecreatefromjpeg($masterURL);
$size = getimagesize($masterURL);
$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);
imagedestroy($image);
imagedestroy($watermark);
?>

もう少し読んだ後(同じ記事のこのコメント)、PNG-24透かしを使用できることがわかりましたがimagecopyimagecopymerge. この行を置き換えることができます:

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);

これで:

imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);

透かしファイルは小さいため、PNG-8 透かしを使用imagecopymergeすると、「その場で」透かしを入れるのに非常に適しています。「舞台裏」で透かしを入れる場合、ファイルサイズはそれほど重要ではなく、imagecopy.

これが混乱しているウォーターマーカーの助けになることを願っています。

于 2012-07-27T03:30:39.453 に答える