PHP & Others

GD 썸네일에 로고를 새겨보자

페이지 정보

본문

이제 제대로 된 썸네일생성이 얼마남지 않았네요.. 로고 추가만 하면 이제 썸네일을 자유 자제로 생성할수 있습니다. 이번에는 만들어둔 썸네일에 자신만의 로고를 추가해 보도록 하겠습니다. 물론 썸네일 뿐만아니라 갤러리 게시판에 이미지를 업로드 하는순간 이미지에 자신의 로고를 추가하여 이미지가 생성되게도 할 수 있습니다. 간단히 말해 자신의 이미지에 자신만의 도장을 찍을수 있습니다~.

이번에 준비할 건 테스트용으로 쓸 이미지 파일과 자신의 로고입니다. 로고는 일단 간단하게 GIF나 PNG 파일로 제작합니다. 대신 이미지 부분만을 적용하기 위해 배경이 없는 투명이미지를 제작합니다.

그리고 다음 소스를 만들어 함께 저장한 후 같은 디렉토리에 업로드 합니다.

테스트이미지 : test.jpg
로고이미지 : logo.png
소스 : test.php

----------- test.php 시작 --------------------------
<?
function thumbnail($file, $save_filename, $max_width, $max_height)
{
        $src_img = ImageCreateFromJPEG($file); //JPG파일로부터 이미지를 읽어옵니다

        $img_info = getImageSize($file);//원본이미지의 정보를 얻어옵니다
        $img_width = $img_info[0];
        $img_height = $img_info[1];

        if(($img_width/$max_width) == ($img_height/$max_height))
        {
            $srcx=0;
            $srcy=0;
            $srcW=$img_width;
            $srcH=$img_height;
        }
        elseif(($img_width/$max_width) < ($img_height/$max_height)) //ceil함수는 소수점을 올림합니다
        {
            $srcx=0;
            $srcH=ceil(($img_width / $max_width) * $max_height);
            $srcy=($img_height - $srcH) / 2;
            $srcW=$img_width;
        }
        else{
            $srcy=0;
            $srcW=ceil(($img_height / $max_height) * $max_width);
            $srcx=($img_width - $srcW) / 2;
            $srcH=$img_height;
        } //위의함수와는달리 센터값을 중심으로 썸네일크기에 맞게 남는부분은 잘라냅니다.

        $dst_img = imagecreatetruecolor($max_width, $max_height); //타겟이미지를 생성합니다

        ImageCopyResized($dst_img, $src_img, 0, 0, $srcx, $srcy, $max_width, $max_height, $srcW, $srcH); //타겟이미지에 원하는 사이즈의 이미지를 저장합니다


        $overlay_img=ImageCreateFromPNG("logo.png");
        $overlay_img_x = imageSX($overlay_img); //오버레이 이미지 사이즈 X값
        $overlay_img_y = imageSY($overlay_img); //오버레이 이미지 사이즈 Y값

        $offsetX = $max_width - ImageSX($overlay_img) - 3; //왼쪽 아래에서 3픽셀만큼 떨어진곳에 로고를 새깁니다
        $offsetY = $max_height - ImageSY($overlay_img) - 3;

        ImageAlphaBlending($dst_img, true); //배경을투명하게지정합니다
        ImageCopy($dst_img,$overlay_img,$offsetX,$offsetY,0,0,$overlay_img_x,$overlay_img_y);

        ImageInterlace($dst_img);
        ImageJPEG($dst_img,  $save_filename); //실제로 이미지파일을 생성합니다
        ImageDestroy($dst_img);
        ImageDestroy($src_img);
        ImageDestroy($overlay_img);
}
?>
<? thumbnail("test.jpg","thumblogo.jpg","200","150") ?>

<span style="font-size:9pt;"><center>
원본이미지<br>
<img src='test.jpg'><br><br><br>
원본이미지를 200*150으로 축소한뒤 다음과 같은 로고이미지를 추가합니다.<br><br>
로고이미지
<br><img src='logo.png'><br><br><br>
원본과 로고이미지를 합성해 만들어진 이미지
<br><img src='thumblogo.jpg'>
</span>
----------- test.php 여기까지 -----------------------

결과 확인하러 가기 : http://rubusy.com/study/thumb02/logo.php

추가된 부분은 ImageAlphaBlending 과 ImageCopy 구문입니다. 전자는 배경이미지의 알파값을 true로 설정해 배경을 투명하게 지정하는 부분이고 후자는 두이미지를 합성해 $dst_img에 반환하는 구문입니다. 간단히 설명하자면...

ImageCopy($dst_img,$overlay_img,$offsetX,$offsetY,0,0,$overlay_img_x,$overlay_img_y);

원본이미지인 $dst_img와 오버레이할 이미지인 $overlay_img 를 합친다음 $dst_img로 반환합니다. 이때 오버레이할 이미지인 $overlay_img의 가로,세로 위치는 $offsetX,$offsetY 입니다. 그 다음의 0,0은 오버레이할 이미지의 시작점입니다. 오버레이할 이미지 모두를 집어넣을 것이므로 0,0에서 시작해야합니다. $overlay_img_x,$overlay_img_y 는 오버레이할 이미지의 너비와 높이구요..

ImageCopyResized와 비슷한 구조입니다. 위의 그림을 참고하세요~ 
출처 :: http://rubusy.com/bbs/view.php?id=pjboard&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=11
 

관련자료

등록된 댓글이 없습니다.
Today's proverb
외로움의 가장 큰 문제는 자신만이 외롭다고 생각하는 것이다. (존. 록펠러)