가로세로 비율틀려지지 않고 크기에 맞는 썸네일 만들기

출처 – phpschool.com

이런게 필요해서 검색해봤더니 가로세로 비율 유지하면서 만드는거나, 무조건 크롭시키는 소스는 있는데 알맞는 크기로 비율을 유지하며 만드는건 없더군요.. 하나 있긴 했는데 리눅스 명령을 사용하는거라서 이식성부족했구요..
그냥 gd만을 이용해서 썸네일을 만들어주는 함수입니다.
600×400 이미지를 300×200 으로 만들라고 하면 당연히 비율에 맞게 줄여지겠지만 400×600이미지를 300×200으로 만들라고 하면 3/4 비율로 줄인후 세로를 가운데를 중심으로 crop 시켜줍니다.
이미지에서 중요한 부분은 가운데쪽에 있을꺼같아서 가운데를 중심으로 양쪽 또는 위아래를 잘라내도록 했습니다. 특별한 기술이라기 보다 이런걸 찾는분들 쉽게 찾으시라고 올려드립니다.. 검색에 잘 걸리게 키워드도 넣어두지요. ㅎㅎ

사용법은 thumbnail(파일명,x사이즈,y사이즈) 입니다.
그럼 소스 갑니다.
/****************************************************************************
* thumbnail.lib.php
* 가로세로 비율이 흐트러지지 않고 지정한 크기로 썸네일을 만들어줌
* 2002.2.18 – 거친마루
*****************************************************************************/

## Image LoadJpeg (String $fName);
function LoadImage ($fName) {
$file_ext = strtolower(substr(strrchr($fName,”.”), 1)); //확장자
switch ($file_ext) {
case “jpg”: case “jpeg”:
$im = @ImageCreateFromJPEG ($fName);
break;
case “gif”:
$im = @ImageCreateFromGIF ($fName);
break;
case “png”:
$im = @ImageCreateFromPNG ($fName);
break;
}

if (!$im) {
$im = ImageCreate (150, 30);
$bgc = ImageColorAllocate ($im, 255, 255, 255);
$tc = ImageColorAllocate ($im, 0, 0, 0);
ImageFilledRectangle ($im, 0, 0, 150, 30, $bgc);
ImageString ($im, 1, 5, 5, “Error loading $fName”, $tc);
}
return $im;
}

## Image thumbnail_jpg(String $filepath, int $width, int $height);
function thumbnail ($filepath,$width=””,$height=””) {
$size=getimagesize($filepath); //원본 이미지사이즈를 구함
$shr_rateX = $width / $size[0];
$shr_rateY = $height / $size[1];
$base = ($shr_rateX <= $shr_rateY) ? "y" : "x";
$src_im=LoadImage($filepath);
if($base == “y”) {
$new_width=round(($size[0] * $height)/$size[1]); // (가로크기 * 새로운 세로 크기) / 세로크기
$offsetX = round(($new_width – $width) / 2); //각각 좌우로 잘라낼 길이
$offsetY = 0;
}
if($base == “x”) {
$size=getimagesize($filepath); //원본 이미지 사이즈 구함
$new_height=round(($size[1] * $width)/$size[0]); // (세로크기 * 새로운 가로크기) / 가로크기
$offsetX = 0;
$offsetY = round(($new_height – $height) / 2); // 각각 상하로 잘라낼 길이
}

$dst_im=ImageCreate($width,$height); //결과물 이미지 생성
ImageCopyResized($dst_im,$src_im,0,0,$offsetX,$offsetY,$width,$height,ImageSX($src_im)-$offsetX,ImageSY($src_im)-$offsetY); //만들기
return $dst_im;
}

?>