[펌][함수] 콘솔용 이미지 유틸리티를 이용한 썸네일 제작기법 공개

안녕하세요 권영칠입니다.

간만에 팁&테크란을 찾았습니다.
오늘은 제가 여러분과 정보를 하나 공개하고자 합니다.

웹 어플리케이션에서 썸네일은 그 활용범위가 무척이나 넓습니다. 제가 처음 썸네일에 관심을 둔것은 제작년 pcbee.co.kr을 개발하면서였습니다. 물론 당시에는 조금 무식한 방법을 동원하기는 했지만, 그래도 나름대로 하루 100만이상의 페이지뷰를 소화하며 정상적으로 서비스가 가능했었습니다. 그때 이후로 지금 회사에서 사용하는 썸네일로 지속적인 보완작업을 했고, 지금에 이르렀습니다.
물론 썸네일에 아주 많은 시간을 투자한것은 아니지만, 가장 효율적인 방법을 찾기위해 많은 생각을 한것은 사실입니다.

썸네일 + GD 2.0.1 등은 아직 공개할 수준은 아니고, 일단 일반적인 썸네일에 대해서 공개하려 합니다.

여기에는 일단 두가지의 콘솔용 그래픽 제어 프로그램들이 들어갑니다.

1. Netpbm-9.16 (http://download.sourceforge.net/netpbm)
2. ImageMagick-5.3.8 (http://www.imagemagick.org)

둘다 현재의 버전입니다.

이 프로그램들을 적당히 컴파일해서 사용하면 서버상의 이미지를 마음껏 가공할 수 있습니다. 아래의 함수는 다만 파일 사이즈와 크기를 조절해주는 정도이지만, 여러가지로 활용이 가능하실겁니다. Netpbm 의 경우에는 pnmscale 과 pnmcut 등이 이용됩니다. 또 ImageMagick 의 경우에는 줄여준 이미지가 뿌옇게 보이는것을 방지하기 위한 Shapen필터를 입혀 선명하게 해줍니다. 이것이 골자이죠.

ImageMagick 에는 convert 라는 프로그램이 그 역할을 해줍니다. combine 이나 또 다른 유틸을 쓰면 여러가지 편집까지도 가능하지요.

사설이 너무 길었군요. 아래 함수입니다.
(참고로 이 함수는 현재 http://www.betanews.co.kr 의 커뮤니티에 적용된것으로 기능이 많이 미약한 버전입니다. 쇼핑몰이나 컨텐츠 제작에 들어가는 이미지 변환에 대한것은 게시판상에서는 노출시켜드리기가 어려움을 이해부탁드립니다.

방식도 간단하고 유틸리티만 알면 누구나 가능할겁니다.

############## 시작
# 제작자 : 권영칠 (cto@icoda.co.kr)
# 사용법 : Resize_Image(“원본경로”,”타겟경로”,”파일명”,”만들가로크기”,”만들세로크기”);
# 전제조건 : copy() 함수등으로 이미 이미지는 서버상에 있어야 한다.

function Resize_Image($dir,$tdir,$file,$tx,$ty) {
global $debug; // 디버그를 위해 앞에서 받아온다.(없어도됨)
$tmp_pnm = time().”.pnm”; // 템프 파일명
$tmp2_pnm = time().”1.pnm”; // 두번째 템프파일명

$ext = explode(“.”, strtolower($file)); // 파일의 확장자를 감별한다. .으로 구분후 맨마지막것을 가져옴
$ext = $ext[count($ext)-1]; //

if($ext != “jpg” && $ext != “gif”) {
// jpg 와 gif 확장자에 대해서만 적용. 나머지는 알아서..
}

if(!Is_dir(“$tdir”)) mkdir(“$tdir”,0755);
if($ext == ‘jpg’) exec(“djpeg -pnm $dir/$file > /tmp/$tmp_pnm”); // djpeg 로 pnm 으로 만든다. djpeg가 없으면 netpbm의 jpegtopnm 을 이용해도됨
elseif($ext == ‘gif’) exec(“giftopnm $dir/$file > /tmp/$tmp_pnm”); // netpbm 의 giftopnm 을 이용해 pnm 파일로 바꿔준다.

$size=GetImageSize(“$dir/$file”); // 원본이미지의 크기 알아내기

$xx = $size[0]; // 변수를 알기쉽게 바꿈
$yy = $size[1]; // 정신사납기 때문에 ㅡㅡ;

if($xx > $tx && $yy > $ty) { // 타겟보다 이미지가 클경우에만 변환을 하게한다. 왜냐면 작은 이미지의 경우 크기가 늘어나므로..

$xper = $xx/$tx; // 가로의 비율
$yper = $yy/$ty; // 세로의 비율
$chkper = $xper-$yper; // 체크 비율

if($chkper > 0 ) { // 가로비율이 커서 가로를 자를경우
$s = $yy/$ty;
$fx = intval($tx*$s);
$px = intval(($xx-$fx)/2);
$py = 0;
exec(“pnmcut $px $py $fx $yy /tmp/$tmp_pnm > /tmp/$tmp2_pnm”);
exec(“pnmscale -xsize $tx /tmp/$tmp2_pnm | cjpeg -quality 95 -outfile $tdir/$file”);
} elseif($chkper < 0) { // 세로비율이 커서 가로를 자를경우
$s = $xx/$tx;
$fy = intval($ty*$s);
$px = 0;
$py = intval(($yy-$fy)/2);
exec(“pnmcut $px $py $xx $fy /tmp/$tmp_pnm > /tmp/$tmp2_pnm”);
exec(“pnmscale -ysize $ty /tmp/$tmp2_pnm | cjpeg -quality 95 -outfile $tdir/$file”);
} else {
exec(“pnmscale -xsize $tx /tmp/$tmp_pnm | cjpeg -quality 95 -outfile $tdir/$file”);
}
exec(“convert -sharpen 1 -gamma 0.8 $tdir/$file $tdir/$file”);
@unlink(“/tmp/$tmp_pnm”);
@unlink(“/tmp/$tmp2_pnm”);

if($debug == “On”) { // 디버그를 위한 옵션. 없어도 무방
echo ”
<b>디버그 정보</b> : <br>
<br>
원본파일 : $imgname ( $xx x $yy Pixels ) <br>
타겟파일 : $file ( $tx x $ty Pixels) <br>
<hr size=1 noshade>
<b>연산 정보</b> : <br>
$xper = $xx / $tx<br>
$yper = $yy / $ty<br>
chkper = $xper-$yper = $chkper;
<br>
if(chkper > 0) {<br>
$s = $yy/$ty;<br>
$fx = $tx*$s;<br>
$px = ($xx-$fx)/2;<br>
$py = 0;<br>
} elseif($chkper < 0) {<br>
$s = $xx/$tx;<br>
$fy = $ty*$s;<br>
$px = 0;<br>
$py = ($yy-$fy)/2;<br>
} else {<br>
<br>
djpeg -pnm $dir/$file > /tmp/$tmp_pnm<br>
pnmcut $px $py $fx $yy /tmp/$tmp_pnm > /tmp/$tmp2_pnm<br>
pnmscale -xsize $tx /tmp/$tmp2_pnm | cjpeg -quality 95 -outfile $tdir/$file<br>
<Br>
djpeg -pnm $dir/$file > /tmp/$tmp_pnm<br>
pnmcut $px $py $xx $fy /tmp/$tmp_pnm > /tmp/$tmp2_pnm<br>
pnmscale -xsize $tx /tmp/$tmp2_pnm | cjpeg -quality 95 -outfile $tdir/$file<br>

}
“;
}
}
// return $imgname;
}
################ 끝

이상입니다.
여기서 웹상 쿼리에서 debug = On 으로 해두시면
어떻게 연산되어 처리되는지가 나옵니다.
이 함수의 골자는 원하는 크기의 이미지를 생성하되 pnmcut으로 이미지를 먼저 비율에 맞게 자르고난 후, pnmscale 로 리사이징을 하고, 그것을 convert 프로그램으로 감마값 변경과 선명하게 해주는 sharpen 필터링을 하는것입니다. 여기에 combine 을 사용하면 이미지에 로고를 넣는다던가.. 뭐 그런일도 가능하지요. 여긴 사용자들위주의 커뮤니티라 간단한 썸네일을 응용하게 하려고 소스도 짧고 큰 기능이 없다는것을 이해해주시고, pcbee.co.kr, gamebee.co.kr 을 서핑하시면 거기에 나오는 모든 컨텐츠의 이미지부분과 www.icoda.co.kr 의 제품 이미지들.. 그리고 betanews의 각종 게시판 이미지들이 모두 이러한 유틸리티를 이용해 썸네일로 제작되어 진것입니다.

사실 소스 공개를 해도 될까라고 생각했었는데 더 좋은 고견이 나오지 않을까 하고 쑥스럽지만 올려봅니다. 나중에 반응이 좋으면 파일이 아닌 DB의 BLOB와 함께 사용하는 썸네일이나 GD 라이브러리의 새버전인 2.0.1베타를 이용하는 방법등을 올려보도록 하겠습니다.

.권영칠

http://www.icoda.co.kr
http://www.betanews.co.kr

출처 : PHPSCHOOL

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다