웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
썸네일 자동생성하고 이미지 사이즈 자동 줄이기...
2003.05.21 02:53
내용은 글 제목과 같습니다.
큰 이미지를 업로드 시키면 자동으로 썸네일 이미지를 하나더 만들고 이미지 사이즈가 너무 크다면 줄여 줍니다.
구현 방법은 리눅스에 있는 프로그램을 이용하여 jpeg, gif 를 pnm 이미지로 만든 다음 pnm 이미지를 다시 적당한 크기의 jpg 파일로 만듭니다.
----------------------------------------------------------------------------------------------------------------------
$bigX = 640;
$bigY = 480;
$smallX = 100;
$smallY = 75;
if(is_uploaded_file($_FILES[c_pics][tmp_name])){
$upload_img_no = 'n';
$type = explode("/", $_FILES[c_pics][type]);
if($type[0] == "image"){// 업로드된 파일의 형식을 체크 합니다.
$ext = ($type[1] == "pjpeg")? "jpg": $type[1];
$ser = mkSer(6); // 저의 경우는 동시에 여러장의 그림을 업하는 관계로 6자리의 임의 알파벳을 읽어오는 함수를 사용 => 파일이름
$filename = $now.$ser;
$img_name = $filename.".".$ext;
$img_pnm = $filename.".pnm";
$img_pnm1 = $filename."1.pnm";
##일단 임시 디렉토리로 이동시켜서
if(move_uploaded_file($_FILES[c_pics][tmp_name], "{$img_tmp_dir}/{$img_name}")){
exec("chmod 655 {$img_up_dir}/{$img_name}");
$orgSize = getimagesize("{$img_tmp_dir}/{$img_name}");
if($orgSize[0] > $bigX && $orgSize[1] > $bigY){
### pnm 이미지로 변환
if($ext == 'jpg') exec("djpeg -pnm {$img_tmp_dir}/{$img_name} > {$tmp}/{$img_pnm}");
elseif($ext == 'gif') exec("giftopnm {$img_tmp_dir}/{$img_name} > {$tmp}/{$img_pnm}");
exec("pnmscale -xsize {$bigX} {$tmp}/{$img_pnm} | cjpeg -quality 85 -outfile {$img_up_dir}/{$filename}.jpg");
exec("pnmscale -ysize {$bigY} {$tmp}/{$img_pnm} | cjpeg -quality 85 -outfile {$img_up_dir}/{$filename}.jpg");
if($i == 0){
### 썸네일 이미지를 만듭니다.
exec("djpeg -pnm $img_up_dir/{$filename}.jpg > {$tmp}/{$img_pnm1}");
exec("pnmscale -xsize {$smallX} {$tmp}/{$img_pnm1} | cjpeg -quality 100 -outfile {$thumb_dir}/{$filename}.jpg");
exec("pnmscale -ysize {$smallY} {$tmp}/{$img_pnm1} | cjpeg -quality 100 -outfile {$thumb_dir}/{$filename}.jpg");
}
$img_name = $filename.".jpg";
}
else{
exec("cp $img_tmp_dir/$img_name $img_up_dir/$img_name");
//$img_name = $filename.".jpg";
}
@unlink("$img_tmp_dir/$img_name");
@unlink("$tmp/$img_pnm1");
@unlink("$tmp/$img_pnm");
echo("<div>OK! : $_FILES[c_pics][name]</div>");
}
else{
echo("<div>Failure! : $_FILES[c_pics][name]</div>");
}
}
else echo("<div>Warning : $_FILES[c_pics][name] is Not a Image File</div>");
}
큰 이미지를 업로드 시키면 자동으로 썸네일 이미지를 하나더 만들고 이미지 사이즈가 너무 크다면 줄여 줍니다.
구현 방법은 리눅스에 있는 프로그램을 이용하여 jpeg, gif 를 pnm 이미지로 만든 다음 pnm 이미지를 다시 적당한 크기의 jpg 파일로 만듭니다.
----------------------------------------------------------------------------------------------------------------------
$bigX = 640;
$bigY = 480;
$smallX = 100;
$smallY = 75;
if(is_uploaded_file($_FILES[c_pics][tmp_name])){
$upload_img_no = 'n';
$type = explode("/", $_FILES[c_pics][type]);
if($type[0] == "image"){// 업로드된 파일의 형식을 체크 합니다.
$ext = ($type[1] == "pjpeg")? "jpg": $type[1];
$ser = mkSer(6); // 저의 경우는 동시에 여러장의 그림을 업하는 관계로 6자리의 임의 알파벳을 읽어오는 함수를 사용 => 파일이름
$filename = $now.$ser;
$img_name = $filename.".".$ext;
$img_pnm = $filename.".pnm";
$img_pnm1 = $filename."1.pnm";
##일단 임시 디렉토리로 이동시켜서
if(move_uploaded_file($_FILES[c_pics][tmp_name], "{$img_tmp_dir}/{$img_name}")){
exec("chmod 655 {$img_up_dir}/{$img_name}");
$orgSize = getimagesize("{$img_tmp_dir}/{$img_name}");
if($orgSize[0] > $bigX && $orgSize[1] > $bigY){
### pnm 이미지로 변환
if($ext == 'jpg') exec("djpeg -pnm {$img_tmp_dir}/{$img_name} > {$tmp}/{$img_pnm}");
elseif($ext == 'gif') exec("giftopnm {$img_tmp_dir}/{$img_name} > {$tmp}/{$img_pnm}");
exec("pnmscale -xsize {$bigX} {$tmp}/{$img_pnm} | cjpeg -quality 85 -outfile {$img_up_dir}/{$filename}.jpg");
exec("pnmscale -ysize {$bigY} {$tmp}/{$img_pnm} | cjpeg -quality 85 -outfile {$img_up_dir}/{$filename}.jpg");
if($i == 0){
### 썸네일 이미지를 만듭니다.
exec("djpeg -pnm $img_up_dir/{$filename}.jpg > {$tmp}/{$img_pnm1}");
exec("pnmscale -xsize {$smallX} {$tmp}/{$img_pnm1} | cjpeg -quality 100 -outfile {$thumb_dir}/{$filename}.jpg");
exec("pnmscale -ysize {$smallY} {$tmp}/{$img_pnm1} | cjpeg -quality 100 -outfile {$thumb_dir}/{$filename}.jpg");
}
$img_name = $filename.".jpg";
}
else{
exec("cp $img_tmp_dir/$img_name $img_up_dir/$img_name");
//$img_name = $filename.".jpg";
}
@unlink("$img_tmp_dir/$img_name");
@unlink("$tmp/$img_pnm1");
@unlink("$tmp/$img_pnm");
echo("<div>OK! : $_FILES[c_pics][name]</div>");
}
else{
echo("<div>Failure! : $_FILES[c_pics][name]</div>");
}
}
else echo("<div>Warning : $_FILES[c_pics][name] is Not a Image File</div>");
}
댓글 6
-
TheMics
2003.05.21 18:47
-
행복한고니
2003.05.21 23:13
오늘 회사에서 쇼핑몰을 만들다가 상품 업하는 곳에서 pnmscale 을 써보려고 했더니 파일이 없더군요. 훗... 레뎃 7.2 이상이면 거의 다 기본적으로 깔린다더니... 순 거짓말... 해당 호스팅 회사가 레뎃 7.2 버전을 쓰는데도 안 깔려 있더군요. -_-;;
근데... 퍼온게 아니라면 NZEO에는 초보분들이 많아서 $_FILES[c_pics] 가 왜 쓰였는지에 대한 설명도 있어야 할텐데 그냥 썼네요. 나중에 "그대로 했는데 안되요~~" 라는 질문 많이 들어옵니다. 거기다가 $img_tmp_dir 이나 $tmp 등 정의되지 않고 쓰인 변수들도 보이는군요. 그에 대한 설명도 없구요. 저것만으로는 그냥 에러가 발생해버릴 듯...
그나저나 바이너리 실행파일이 많이 쓰이네요. pnmscale, djpeg, giftopnm, cjpeg...
-_-;; 하나라도 안되면 에러가... 음... GD 2.0 에 있는 함수들로도 충분히 쓸 수 있는데... 떱... -
코퍼
2003.05.22 05:06
GD를 쓰면 셈네일 만드는 주요코드는 간단한 명령에 불과한데 이거 무지하게 복잡하게 되어 있네요.
아마도 다른 소스에서 일부 코드를 떼오신듯 ... -
sMokaHallo
2003.05.24 01:42
ㅎㅎㅎ
이궁 두서없이 중요부분만 올려서뤼 문제가 많군요
먼저 고니 님이 말씀하신
$img_tmp_dir 은 pnm 이미지를 만들기 위해 업로드된 이미지를 임시로 저장하는 디렉토리구여 아랫부분에 unlink 한거 보이시죠?^^&
$tmp 는 pnm 이미지가 저장되는 디렉토리 입니다.
그리고 pnm으로 변환시키는 것은 gif, jpg를 바로 사이즈를 줄이고 압축을 하는 기능을 제가 아는 수준에서는 구현이 힘들어서 PHP School에서 어떤 님이 올려 주신 소스를 제게 맞게 적용 한것이구요
$_FILES[c_pics][tmp_name][$i] 과 같이 사용한 것은 파일 업로드 가
<input type=file name='c_pics[]'>
<input type=file name='c_pics[]'>
<input type=file name='c_pics[]'>
<input type=file name='c_pics[]'>
와 같이 6개가 있기 때문이져 그래서 위 소스는 그 루프의 중간 부분이구요 ^^&
그리고 가운데 mkSer($val)은 $val 만큼 임의의 수를 만드는 제가 만든 함수 입니다.
이상 답변이 되었나요? -
행복한고니
2003.05.24 14:31
죄송합니다만... 저 소스 다 알고 쓰신거 맞죠?
그렇다면 좀 더 범용적으로 쓸 수 있게 수정해주시는게 어떨까 합니다.
예를 들면, 업로드할 이미지가 640x480 이 될지 어떨지는 아무도 모르는 거죠(며느리도 모릅니다 -_-;;). 물론 폼 이름이 c_pics 가 아닐수도 있는거죠.
웹 프로그래밍이 어려운 이유는 너무도 다양한 종류의 사용자들이 사용하기 때문이랍니다. ^^ -
명랑폐인™
2003.05.26 10:57
썸네일 된 이미지의 화질을 생각한다면, imagemagick 을 사용하는것도 생각해보세요..
www.imagemagic.net 에서 관련자료를 다운해서 컴파일후 설치할수 있습니다.
php에서 pear가 지원되는 버전이어야 하면, php컴파일시에 --width 옵션을 통해서 라이브러리를 포함해주면 됩니다.
http://www.mjava.net/study/thumbnail/view_image.php에 gd를 이용한방법과 imagemagic을 이용한 샘플이 있습니다. 선명한 썸네일을 얻을려면 그만큼 서버의 cpu소비가 큽니다. 염두에 두세요.
제목 | 글쓴이 | 날짜 |
---|---|---|
htmlspecialchars 사용하시는 분들 [5] | holies | 2003.07.11 |
이미 인클루드된 파일은 다시 인클루드하지 않기 [14] | 김병희 | 2003.06.20 |
PHP 익히기 3 [11] | 구리구리 | 2003.06.17 |
PHP 익히기 2 [9] | 구리구리 | 2003.06.10 |
PHP 익히기 1 [24] | 구리구리 | 2003.06.09 |
php 로 기존 문서 포함시키기 [10] | 이성헌 | 2003.06.08 |
체크박스등으로 배열로 변수를 넘길때.. [1] | myself2 | 2003.06.06 |
홈페이지의 내용을 DB에 담기 [15] | 세죠위그이 | 2003.05.30 |
썸네일 자동생성하고 이미지 사이즈 자동 줄이기... [6] | sMokaHallo | 2003.05.21 |
Wake On Lan 기능 사용하기... [3] | sMokaHallo | 2003.05.17 |
스킨 시스템 구축.(1탄 읽어오기) [11] | 씨파개 | 2003.05.13 |
none 과 null 처리 문제 해결법 [5] | 허현승 | 2003.05.12 |
세션파일 크기/만들어진 시간체크해서 정해진 시간이후엔 파일 지우기?;; (라고 써야되낭? ;;) [6] | 다오케이 | 2003.05.12 |
PHP+MSSQL?(수정판) [11] | 씨파개 | 2003.05.10 |
이미지 전용 파일업로드시의 확장자 체크시.. [4] | 특급잠수부 | 2003.05.07 |
mysql_fetch_row n mysql_fetch_array n mysql_fetch_object [4] | sMokaHallo | 2003.05.06 |
if 시리즈 2탄.. ㅡㅡ;; [9] | 씨파개 | 2003.05.05 |
PHP 확장 함수를 이용한 exif 정보 출력 [1] | NoSoRi | 2003.04.30 |
if 시리즈 1탄! [15] | 씨파개 | 2003.04.28 |
ID3v1태그 읽는 함수입니다. [4] | 김승태 | 2003.04.27 |
그건 그렇고 호스팅받아 쓰시는분들은 저 소스 사용이 좀 어렵겠군요..대부분 exec를 막아두니까;