PHP 이미지 워터마크 처리
워터마크 생성은 전체 기술 중 가장 간단한 단계입니다. 워터마크의 위치를 찾는 데는 처음에는 약간의 얕은 기하학적 지식이 필요합니다.
지난 장에서는 이미지 크롭 기술을 배웠습니다. 워터마크는 이미지 크롭 기술의 작은 변형일 뿐입니다.
약간의 핵심 기하학적 지식:
1. 이미지 크기
2. 이미지가 배치되는 좌표
3. 너비와 이미지 높이
사진 워터마킹 기술의 핵심은 두 장의 사진, 즉 큰 사진 하나와 작은 사진 하나에 해당합니다. 큰 이미지 내의 어딘가에 작은 이미지를 배치합니다.
워터마크 기술은 이 중 가장 간단한 기술입니다.
1. 원본 이미지(작업 대상 이미지라고도 함)를 엽니다.
2. 워터마크 이미지 열기 (워터마크 원본 이미지라고도 함)
3. imagecopymerge를 사용하여 작은 이미지를 큰 이미지의 지정된 위치에 병합
4. 이미지 출력
.5 리소스 삭제
1. 단순 이미지 워터마크
워터마크가 필요한 대상 이미지(d:/에 저장되어 있다고 가정) www/img/meinv.jpg 내 컴퓨터), 그림은 다음과 같습니다.
추가해야 할 로고 그림(d:/에 저장되어 있다고 가정) www/img/logo.png 내 컴퓨터) 사진은 다음과 같습니다.
가장 중요한 것은 이 기능을 사용하는 것입니다.
bool imagecopymerge (resource $ target image, resources $ source image, int $ target start x, int $target start y, int $source x, int $source y, int $source width, int $source height, int $transparency )
참고:
투명도 값은 0~100의 정수입니다. imagecopy와 imagecopymerge의 차이점은 하나는 투명도가 있고 다른 하나는 투명도가 없다는 것입니다.
요약된 단계에 따라 간단한 방법을 수행하세요.
<?php //打开目标图片 $dst = imagecreatefrompng('/upload/course/000/000/002/5833ebba648cf229.png'); //打开Logo来源图片 $src = imagecreatefrompng('/upload/course/000/000/002/5833ebe90cc11285.png'); //得到目标图片的宽高 $dst_info = getimagesize('5833ebba648cf229.png'); //得到logo图片的宽高 $src_info = getimagesize('5833ebe90cc11285.png'); //放到最右下脚可得出图片水印图片需要开始的位置即: //x点位置:需要大图的宽 - 小图的宽; //y点位置:放大图的高 - 小图的高 $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. A를 하세요. 스마트 이미지 워터마크 기능
1. 이미지를 자동으로 여는 기능을 만들 수 있습니다
우리는 이전에 이미지 생성 또는 이미지 열기 기능을 모두 배웠습니다.
1.
2.imagecreatetruecolor
3.imagecreatefromjpeg 등
추리해 봅시다. 이미지의 MIME 유형을 얻는 방법을 찾을 수 있다면 MIME 유형을 기반으로 파일을 여는 기능만 찾을 수 있습니다.
따라서 이 단계는 두 부분으로 나뉩니다.
1. 파일 MIME 유형과 반환 유형을 가져옵니다.
2. 경로를 전달하고, 함수를 열고, 리소스를 반환합니다.
그러므로 위의 두 블록을 두 가지 기능으로 만들 수 있습니다.
이미지 경로를 입력하고, 이미지의 너비, 높이, MIME 유형을 배열로 반환하고, 필요할 때 해당 매개변수를 사용합니다.
$data의 유형 연관 배열에 MIME 유형을 전달할 수 있습니다. 코드는 다음과 같습니다.
function getImageInfo($path) { $info = getimagesize($path); $data['width'] = $info[0]; $data['height'] = $info[1]; $data['type'] = $info['mime']; return $data; }
파일을 열고 이미지 유형을 전달하고 이미지 경로를 전달하면 이미지가 열리고 리소스 유형이 반환되는 함수입니다.
다음 예에서는 $type이 switch...case를 사용하여 판단됩니다. imagejpeg인 경우 $path에 지정된 경로에 지정된 파일을 여는 데 imagecreatefromjpeg가 사용됩니다. 마지막으로 리소스 유형이 반환됩니다.
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; }
위치 자동 계산:
위치를 0~9 범위의 10개 값으로 나눌 수 있습니다.
그림을 사용하여 위치를 나타냅니다.
참고:
0은 임의의 위치이며 나타날 수 있습니다. 페이지의 어느 곳에서나. 그러나 그림의 범위를 초과할 수는 없습니다.
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; }
마지막으로 이미지 병합, 출력 및 삭제 코드를 호출합니다.
imagecopymerge($dst,$src,$x,$y,0,0,$logo['width'],$logo['height'],$tm);
그 후 최종 코드를 통합합니다. , 효과를 볼 수 있는 실험을 해드립니다:
rree본 글은 기술 인력만을 위한 기술 소통과 학습, 교류를 위한 글입니다.
이 기사에 사용된 이미지:
판빙빙 씨의 사진은 상업적 용도로 사용되지 않습니다. 모든 소유권은 Fan Bingbing 여사와 관련 기관에 속합니다.
본 글에 사용된 로고는 바이두의 로고입니다.
이것은 성명입니다!