PHP 이미지 워터마크 처리LOGIN

PHP 이미지 워터마크 처리

워터마크 생성은 전체 기술 중 가장 간단한 단계입니다. 워터마크의 위치를 ​​찾는 데는 처음에는 약간의 얕은 기하학적 지식이 필요합니다.

지난 장에서는 이미지 크롭 기술을 배웠습니다. 워터마크는 이미지 크롭 기술의 작은 변형일 뿐입니다.

약간의 핵심 기하학적 지식:

1. 이미지 크기

2. 이미지가 배치되는 좌표

3. 너비와 이미지 높이

사진 워터마킹 기술의 핵심은 두 장의 사진, 즉 큰 사진 하나와 작은 사진 하나에 해당합니다. 큰 이미지 내의 어딘가에 작은 이미지를 배치합니다.

워터마크 기술은 이 중 가장 간단한 기술입니다.

1. 원본 이미지(작업 대상 이미지라고도 함)를 엽니다.

2. 워터마크 이미지 열기 (워터마크 원본 이미지라고도 함)

3. imagecopymerge를 사용하여 작은 이미지를 큰 이미지의 지정된 위치에 병합

4. 이미지 출력

.5 리소스 삭제

1. 단순 이미지 워터마크

워터마크가 필요한 대상 이미지(d:/에 저장되어 있다고 가정) www/img/meinv.jpg 내 컴퓨터), 그림은 다음과 같습니다.

99.png

추가해야 할 로고 그림(d:/에 저장되어 있다고 가정) www/img/logo.png 내 컴퓨터) 사진은 다음과 같습니다.

document_2015-09-22_56010df4559d3.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);

?>

다음과 같이 최종 효과를 확인하세요.

11.png

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개 값으로 나눌 수 있습니다.

그림을 사용하여 위치를 나타냅니다.

document_2015-09-22_5600ef919671d.png


참고:
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 여사와 관련 기관에 속합니다.

본 글에 사용된 로고는 바이두의 로고입니다.

이것은 성명입니다!


다음 섹션
<?php water('zxy.jpg','logo.gif',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; } ?>
코스웨어