PHP畫像の透かし処理
ウォーターマークの生成は、テクノロジー全體の中で最も簡単なステップです。透かしの位置を特定するには、最初は淺い幾何學(xué)的知識(shí)が少し必要です。
前の章では、畫像のトリミング技術(shù)を?qū)Wびました。ウォーターマークは、畫像トリミング技術(shù)を少し変形したものにすぎません。
重要な幾何學(xué)的知識(shí):
1. 畫像のサイズ
2. 畫像が配置される座標(biāo)
3. 畫像の幅と高さ
畫像の透かし技術(shù)の中核は 2 枚の畫像に相當(dāng)します: 1 つの大きな畫像 ; 1 つの小さな畫像。小さい畫像を大きい畫像內(nèi)のどこかに配置します。
ウォーターマーク技術(shù)は、その中で最も単純な技術(shù)です。実裝方法は次のとおりです:
1. 元の畫像 (操作のターゲット畫像とも呼ばれます) を開きます
2. ウォーターマーク畫像 (ウォーターマークのソース畫像とも呼ばれます) を開きます。 3. imagecopymerge を使用します 小さい畫像を大きい畫像の指定された位置にマージします
4. 畫像を出力します
.5 リソースを破棄します
1. シンプルな畫像透かし 必要なターゲット畫像透かしが入っている (コンピューターの d に保存されていると仮定します:/www/img/meinv.jpg)、畫像は次のとおりです:
追加する必要があるロゴ畫像 (d に保存されていると仮定します)。私のコンピューターでは /www/img/logo.png)、畫像は次のとおりです:
最も重要なことは、この関數(shù)を使用することです:
注:
透明度の値は、次の整數(shù)です。 0~100。 imagecopy と imagecopymerge の違いは、一方は透明性を持ち、もう一方は透明性を持たないことです。
要約された手順に従って、簡単な方法を作成します:
<?php //打開目標(biāo)圖片 $dst = imagecreatefrompng('/upload/course/000/000/002/5833ebba648cf229.png'); //打開Logo來源圖片 $src = imagecreatefrompng('/upload/course/000/000/002/5833ebe90cc11285.png'); //得到目標(biāo)圖片的寬高 $dst_info = getimagesize('5833ebba648cf229.png'); //得到logo圖片的寬高 $src_info = getimagesize('5833ebe90cc11285.png'); //放到最右下腳可得出圖片水印圖片需要開始的位置即: //x點(diǎn)位置:需要大圖的寬 - 小圖的寬; //y點(diǎn)位置:放大圖的高 - 小圖的高 $dst_x = $dst_info[0] - $src_info[0]; $dst_y = $dst_info[1] - $src_info[1]; //要將圖片加在右下腳 imagecopymerge($dst, $src, $dst_x, $dst_y, 0, 0, $src_info[0], $src_info[1], 100); header('Content-type:image/png'); imagepng($dst); imagedestroy($dst); imagedestroy($src); ?>
次のように最終的な効果を見てみましょう:
2番目に、スマートな畫像透かし機(jī)能を作成します
まず、自動(dòng)畫像オープニングを作成できます。 function 関數(shù)
私たちは皆、これまでに畫像を作成したり、畫像を開く関數(shù)を?qū)W習(xí)したことがあります:
1.imagecreate
2.imagecreatetruecolor
3.imagecreatefromjpeg など
理由を考えてみましょう。畫像の MIME タイプを取得する方法が見つかったら、MIME タイプに基づいてファイルを開く関數(shù)を見つけるだけです。
したがって、このステップは 2 つの部分に分かれています:
1. ファイルの MIME タイプと戻り値のタイプを取得します。
2. パスを渡し、関數(shù)を開いてリソースを返します。
したがって、上記の 2 つのブロックを 2 つの関數(shù)にできます。
畫像のパスを渡し、畫像の幅、高さ、MIME タイプを配列に返します。必要に応じて、対応するパラメーターを使用します。
$data の型連想配列に MIME タイプを渡すことができます。コードは次のとおりです。
function getImageInfo($path) { $info = getimagesize($path); $data['width'] = $info[0]; $data['height'] = $info[1]; $data['type'] = $info['mime']; return $data; }
ファイルを開き、畫像のタイプを渡し、畫像のパスを渡す関數(shù)。畫像が開かれ、リソースのタイプが返されます。
以下の例では、switch...caseで$typeを判定し、imagejpegの場合は、imagecreatefromjpegを使って$pathのパスで指定されたファイルを開きます。最後に、リソース タイプが返されます。
function openImg($path, $type) { switch ($type) { case 'image/jpeg': case 'image/jpg': case 'image/pjpeg': $img = imagecreatefromjpeg($path); break; case 'image/png': case 'image/x-png': $img = imagecreatefrompng($path); break; case 'image/gif': $img = imagecreatefromgif($path); break; case 'image/wbmp': $img = imagecreatefromwbmp($path); break; default: exit('圖片類型不支持'); } return $img; }
位置を自動(dòng)的に計(jì)算します:
位置を 0 ~ 9 の範(fàn)囲の 10 個(gè)の値に分割できます。
位置を表すために描畫を使用します:
注:
0 はランダムな位置であり、ページ上のどこにでも表示できます。ただし、寫真の範(fàn)囲を超えることはできません。
0の位置は:
x = 0 至 (大圖寬 - 小圖寬) y = 0 至 (大圖高 - 小圖高)
1の位置は:
x = 0 y = 0
2の位置は:
x = (大圖寬 - 小圖寬) /2 y = 0
3の位置は:
x = 大圖寬 - 小圖寬 y = 0
4の位置は:
x = 0 y = (大圖高 - 小圖高) / 2
.... など。
0-9の実裝コードについて推論してみましょう:
switch($pos){ case 1: $x=0; $y=0; break; case 2: $x=ceil(($info['width']-$logo['width'])/2); $y=0; break; case 3: $x=$info['width']-$logo['width']; $y=0; break; case 4: $x=0; $y=ceil(($info['height']-$logo['height'])/2); break; case 5: $x=ceil(($info['width']-$logo['width'])/2); $y=ceil(($info['height']-$logo['height'])/2); break; case 6: $x=$info['width']-$logo['width']; $y=ceil(($info['height']-$logo['height'])/2); break; case 7: $x=0; $y=$info['height']-$logo['height']; break; case 8: $x=ceil(($info['width']-$logo['width'])/2); $y=$info['height']-$logo['height']; break; case 9: $x=$info['width']-$logo['width']; $y=$info['height']-$logo['height']; break; case 0: default: $x=mt_rand(0,$info['width']-$logo['width']); $y=mt_rand(0,$y=$info['height']-$logo['height']); break; }
最後に畫像の結(jié)合、出力、破棄コードを呼び出します:
imagecopymerge($dst,$src,$x,$y,0,0,$logo['width'],$logo['height'],$tm);
最終的なコードを統(tǒng)合してその効果を皆さんにお見せします:
<?php water('/upload/course/000/000/002/5833ebba648cf229.png','/upload/course/000/000/002/5833ebe90cc11285.png',0,50); function water($img,$water,$pos=9,$tm=100){ $info=getImageInfo($img); $logo=getImageInfo($water); $dst=openImg($img,$info['type']); $src=openImg($water,$logo['type']); switch($pos){ case 1: $x=0; $y=0; break; case 2: $x=ceil(($info['width']-$logo['width'])/2); $y=0; break; case 3: $x=$info['width']-$logo['width']; $y=0; break; case 4: $x=0; $y=ceil(($info['height']-$logo['height'])/2); break; case 5: $x=ceil(($info['width']-$logo['width'])/2); $y=ceil(($info['height']-$logo['height'])/2); break; case 6: $x=$info['width']-$logo['width']; $y=ceil(($info['height']-$logo['height'])/2); break; case 7: $x=0; $y=$info['height']-$logo['height']; break; case 8: $x=ceil(($info['width']-$logo['width'])/2); $y=$info['height']-$logo['height']; break; case 9: $x=$info['width']-$logo['width']; $y=$info['height']-$logo['height']; break; case 0: default: $x=mt_rand(0,$info['width']-$logo['width']); $y=mt_rand(0,$y=$info['height']-$logo['height']); break; } imagecopymerge($dst,$src,$x,$y,0,0,$logo['width'],$logo['height'],$tm); imagejpeg($dst); imagedestory($dst); imagedestory($src); } function openImg($path,$type){ switch($type){ case 'image/jpeg': case 'image/jpg': case 'image/pjpeg': $img=imagecreatefromjpeg($path); break; case 'image/png': case 'image/x-png': $img=imagecreatefrompng($path); break; case 'image/gif': $img=imagecreatefromgif($path); break; case 'image/wbmp': $img=imagecreatefromwbmp($path); break; default: exit('圖片類型不支持'); } return $img; } ?>
この記事は技術(shù)者のみが學(xué)びを交換し、技術(shù)を交換することができます。
この記事で使用されている畫像:
ファン?ビンビンさんのイメージ寫真は商用目的ではありません。すべての所有権はファン?ビンビン氏および関連機(jī)関に帰屬します。
この記事で使用されているロゴはBaiduに屬します。
ここに宣言します!