사진에 워터마크를 추가하는 것은 실제로 원본 사진과 워터마크를 함께 추가하는 것입니다. 아래에서는 제가 최근에 정리한 정보를 알려드리겠습니다.
PHP는 주로 GD 라이브러리 확장을 사용하여 이미지 파일을 작동합니다. 이미지를 조작하기 위해 PHP를 자주 사용하면 자연스럽게 많은 기능을 캡슐화하게 되고, 그렇지 않으면 너무 많은 반복 코드를 작성하게 됩니다. 그림과 관련된 함수가 많을 경우 이러한 함수를 정리하는 것을 고려할 수 있으므로 이를 클래스로 캡슐화하는 아이디어를 가지고 있습니다.
사진 작업에는 네 가지 주요 단계가 있습니다.
1단계: 사진 열기
2단계: 사진 조작
3단계: 사진 출력
4단계: 사진 파기
1, 3, 4단계는 매번 작성해야 하며, 매번 거의 동일합니다. 실제로 변경해야 할 유일한 단계는 이미지 조작 단계입니다. 그림 조작은 종종 하나 이상의 주요 GD 기능을 통해 수행됩니다.
이 글의 패키지 클래스에 있는 4가지 메소드는 텍스트 워터마크(imagettftext()), 이미지 워터마크(imagecopymerge()), 이미지 압축, 이미지 자르기(imagecopyresampled())이며 나머지는 일반적으로 사용되는 GD 기능에 대해서는 자세히 설명하지 않습니다.
코드 직접 입력:
info=getimagesize($src); $this->type=image_type_to_extension($this->info['2'],false); $fun="imagecreatefrom{$this->type}"; $this->image=$fun($src); } /** * 文字水印 * @param [type] $font 字体 * @param [type] $content 内容 * @param [type] $size 文字大小 * @param [type] $col 文字颜色(四元数组) * @param array $location 位置 * @param integer $angle 倾斜角度 * @return [type] */ public function fontMark($font,$content,$size,$col,$location,$angle=0){ $col=imagecolorallocatealpha($this->image, $col['0'], $col['1'], $col['2'],$col['3']); imagettftext($this->image, $size, $angle, $location['0'], $location['1'], $col,$font,$content); } /** * 图片水印 * @param [type] $imageMark 水印图片地址 * @param [type] $dst 水印图片在原图片中的位置 * @param [type] $pct 透明度 * @return [type] */ public function imageMark($imageMark,$dst,$pct){ $info2=getimagesize($imageMark); $type=image_type_to_extension($info2['2'],false); $func2="imagecreatefrom".$type; $water=$func2($imageMark); imagecopymerge($this->image, $water, $dst[0], $dst[1], 0, 0, $info2['0'], $info2['1'], $pct); imagedestroy($water); } /** * 压缩图片 * @param [type] $thumbSize 压缩图片大小 * @return [type] [description] */ public function thumb($thumbSize){ $imageThumb=imagecreatetruecolor($thumbSize[0], $thumbSize[1]); imagecopyresampled($imageThumb, $this->image, 0, 0, 0, 0, $thumbSize[0], $thumbSize[1], $this->info['0'], $this->info['1']); imagedestroy($this->image); $this->image=$imageThumb; } /** * 裁剪图片 * @param [type] $cutSize 裁剪大小 * @param [type] $location 裁剪位置 * @return [type] [description] */ public function cut($cutSize,$location){ $imageCut=imagecreatetruecolor($cutSize[0],$cutSize[1]); imagecopyresampled($imageCut, $this->image, 0, 0, $location[0], $location[1],$cutSize[0],$cutSize[1],$cutSize[0],$cutSize[1]); imagedestroy($this->image); $this->image=$imageCut; } /** * 展现图片 * @return [type] [description] */ public function show(){ header("content-type:".$this->info['mime']); $funn="image".$this->type; $funn($this->image); } /** * 保存图片 * @param [type] $newname 新图片名 * @return [type] [description] */ public function save($newname){ header("content-type:".$this->info['mime']); $funn="image".$this->type; $funn($this->image,$newname.'.'.$this->type); } public function __destruct(){ imagedestroy($this->image); } } ?>
주요 논리는 imagecopymerge() 방법 함께 워터마크 효과를 만듭니다. 이 메소드의 메소드 프로토타입과 매개변수를 살펴보겠습니다.
bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int$src_x , int $src_y , int $src_w , int $src_h , int $pct )