웹마스터 팁
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소비가 큽니다. 염두에 두세요.
제목 | 글쓴이 | 날짜 |
---|---|---|
[추천 소스] 최신의 인기가요 뽑아오는 PHP프로그램 [3] | 제누스 | 2002.03.28 |
[수정본]남은 계정 용량 보여주는 PHP 프로그램 [9] | 제누스 | 2002.03.28 |
[수정본]MP3파일를 검색하여 윈앰프로 실시간 감상하기 | 제누스 | 2002.03.28 |
[Yangkun] (함수) 간단 각종 Global 변수 검사 [1] | 양군 | 2002.03.31 |
Hide-Show-Menu 를 PHP로 구현하기... [7] | TryZ | 2002.04.06 |
[수정+파일첨부]NZEO처럼 모드 변경 만들기 - with cookie [6] | TheMics | 2002.04.07 |
[추천 소스] 게시판 답글 알고리즘..(서기생각 -_-;;) [2] | 서기 | 2002.04.10 |
Zero Counter ver 0.9b 이미지 카운터로 만들기.. [5] | _a_SPD_a_ | 2002.04.15 |
[ 삼항연산 ] 조건문 리턴 [6] | 불티나 | 2002.04.20 |
PHP로 아바타를 구현해 봅시다. [18] | ★Zzony~ | 2002.05.13 |
간단한 퀴즈? 프로그램을 짜보자구요~^^ [4] | teenteenv | 2002.05.15 |
NaN ,Undifind, Null 이 먼 말이 다냐? [2] | 최후의성전 | 2002.05.15 |
접속 IP 알아보기..^^ [11] | ZipShin | 2002.05.16 |
echo도 많이 유용하게 사용할수있습니다..^^ [14] | ZipShin | 2002.05.19 |
제가 쓰는 mysql 검색알로리즘 입니다. [5] | 콩알™ | 2002.05.20 |
서기가 쓰는 Echo [12] | 서기 | 2002.05.20 |
MYSQL에 접속하기..^^ [9] | ZipShin | 2002.05.20 |
초보자를 위한 PHP강좌 파일 [chm형식] [5] | ZipShin | 2002.05.21 |
제로보드 상황판때기(?) 만들기... [9] | _a_SPD_a_ | 2002.05.28 |
[씽크식 PHP] 출력, 어떤 방법이 빠를까? [11] | John Sync. | 2002.05.29 |
그건 그렇고 호스팅받아 쓰시는분들은 저 소스 사용이 좀 어렵겠군요..대부분 exec를 막아두니까;