공지가 있을때까지 구매요청/제휴/견적요청을 받지 않습니다.

7강. 썸네일 > PHP 강좌

본문 바로가기
사이트 내 전체검색

HOT - 펜션예약솔루션 - 그누보드5

HOT - 중고차매매솔루션 - 그누보드5

HOT - 중고차매매솔루션 - 그누보드4

HOT - 펜션예약솔루션 - 그누보드4

NEW - 인터넷뉴스 솔루션 - 그누보드5

계좌정보

  • 국민 : 028201-01-019932
  • 대구 : 068-07-021683-8
  •  
  • 예금주 : 림소프트/김상림
  •  

파트너쉽

PHP 강좌

7강. 썸네일

페이지 정보

작성자 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일12-03-07 18:29 조회3,273회 댓글5건

본문

썸네일은, 첨부하여 올려진 이미지를 원하는 사이즈와 비율에 맞게 재생성되어지는 이미지입니다. 이 한줄로 썸네일을 정의하기에 부족하겠지만, 제대로 이해하면 썸네일함수를 만들 준비가 되신겁니다.

썸네일은, 첨부된 원본이미지가 필요하고, 가로,세로사이즈만 주어지면 만들수 있습니다. php에서 썸네일생성시 지원되는 함수가 GD이며, php에 설치가 되어있어야 합니다. 과거에는 gif가 저작권 관련하여 생성이 힘들었지만 최근에는 설치된 계정의 GD함수를 보니 가능해진거 같기도합니다.

php소스내에서 phpinfor() 함수를 통해 계정에 GD가 설치됐는지, 버젼이 얼마인지 어떤 이미지를 읽고 쓸수있는지 나와있습니다. 그누보드 경우 관리자에서 메뉴에서 확인가능합니다.

이미지의 확장자 종류가 gif,jpg,png,bmp등이 있습니다만, bmp는 용량이 커서 일반적으로는 사용이 잘 안되죠. gif 아니면 jpg가 많이 사용되고 png는 투명png를 첨부하여 워터마크로 투명하게 주기위해서 사용이 될겁니다.

알고리즘은, 원본이미지를 php의 gd함수를 이용하여 각 이미지 확장자에 맞게 읽어들이고, 읽어 들인걸 gd함수를 이용하여 이미지를 재생성(복사)할 새로운 이미지공간을 만듭니다. 그리고 기준점에 따라 상단,좌측점을 지정해주고 그에 따라 읽어들인 원본이미지를 새로운 공간위에 복사를 합니다.
이 과정은 눈에 안보이므로, 이해가 잘 안되시는 분이라면 프린터 복사기로 복사하는 되는것과 비슷하게 이해하시면 됩니다.
복사기에 원하는 크기의 흰종이를 넣고 복사를 하는 것과 말이죠..

그리고 복사가 다 되면 원하는 확장자로 원하는 경로와 이름으로 파일을 저장합니다. 원하는 이름과 저장은 하나의 함수로 해결됩니다. ImageJPEG()
마지막으로 읽어들였던 이미지는 삭제해주면 끝입니다.ImageDestroy()

위 이야기가 잘 이해되고, 지금까지 문법을 따라 오셨다면 직접 썸네일함수를 만드실수 있습니다. 왜냐면, 저같은 놈도 만들었으니 말이죠.

아래소스는 7년전에 php배우고 처음 작품으로 만든건데, 새로만들고 싶지만 만들때 고생을한 기억이 있어 아직까지 그냥 쓰는데요.. 림스빌더 rims.lib.php에도 있는 함수입니다.

최근에 워터마크를 넣을일이 있어 약간 수정된것이구요.. 허접한놈에 쓸데없이 좀 길지만 양해구합니다.

//썸네일함수 - 원본경로,가로크기,비율,파일명포함한 저장경로, 워터마크이미지경로(png)
function rims_thumb($file_reading,$img_width,$thumb_rate,$filename,$w_mark_png=''){
	
	global $g4;	

	$img_infor=getimagesize($file_reading);

	if($img_infor[2]==1) $im=ImageCreateFromgif($file_reading);
	elseif($img_infor[2]==2) $im=ImageCreateFromJPEG($file_reading);
	elseif($img_infor[2]==3) $im=ImageCreateFromPNG($file_reading);
	else $im="";	

	$thumb_rate=explode(":",$thumb_rate);

	$width_first="";

	$per_w=$img_width;

	//썸네일 생성 화질비율(가로 크기가 80보다 같거나 크면 85, 그보다 작으면 90)
	if($img_width>=80) $qul=85; else $qul=90;

	$infor_w=$img_infor[0];
	$infor_h=$img_infor[1];

	//이미지 가로크기를 기준으로 크기정의
	if(sizeof($thumb_rate)==1){	//원본비율 그대로		
		if($infor_w<$per_w && $per_h>$infor_h){
			$infor_w=$img_infor[0];
			$infor_h=$img_infor[1];
		}else{
			if($img_infor[0]>$img_infor[1] || $width_first){
				$per_h=($infor_h*$per_w)/$infor_w;
				$infor_w=$per_w;
				$infor_h=$per_h;
			}
			elseif($img_infor[0]<$img_infor[1]){
				$per_h=($infor_w*$per_w)/$infor_h;
				$infor_w=$per_h;
				$infor_h=$per_w;
				$per_h=$per_w;
				$per_w=$infor_w;
	
			}
			else{ 
				$per_h=$per_w;
				$infor_w=$per_w;
				$infor_h=$per_h;
			}
		}
	}else{			//원본비율이 아닌경우
			if($thumb_rate[0]<=$thumb_rate[1]){				
				$div_rate=$thumb_rate[1]/$thumb_rate[0];
				if($div_rate==1) $per_h=$per_w;
					else $per_h=$div_rate*$per_w;
			}else{
				$div_rate=$thumb_rate[0]/$thumb_rate[1];
				$per_h=$per_w/$div_rate;
			}		
			if($per_h<$infor_h && $per_w<=$per_h){
				if($infor_h<$infor_w){
					$infor_h=$per_h;
					$infor_w=($infor_w*$per_h)/$img_infor[1];
				}else{
					$infor_w=$per_w;
					$infor_h=($infor_h*$per_w)/$img_infor[0];
				}
			}
			elseif($per_w<$infor_w && $per_w>=$per_h){
				$infor_h=$per_h;
				$infor_w=($infor_w*$per_h)/$img_infor[1];
				if($infor_w<$per_w){
					$infor_w=$per_w;
					$infor_h=($img_infor[1]*$per_w)/$img_infor[0];
				}else{
					$infor_h=$per_h;
					$infor_w=($img_infor[0]*$per_h)/$img_infor[1];
				}
			}
			elseif($infor_h==$infor_w && $per_w<$infor_w){
				$infor_w=$per_w;
				$infor_h=$per_w;
			}
			else{
				$infor_w=$img_infor[0];
				$infor_h=$img_infor[1];
			}
	}

	//이미지 가운데를 기준
	$move_w=($infor_w-$per_w)/2;
	$move_h=($infor_h-$per_h)/2;
		

	if($img_infor[2]==1){//gif라면
		$dstimg=ImageCreate($per_w,$per_h);
		$color_white=ImageColorAllocate($dstimg,255,255,255);			
		ImageFill ($dstimg,0,0,$color_white);
		ImageCopyResized($dstimg,$im,-$move_w,-$move_h,0,0,$infor_w,$infor_h,ImageSX($im),ImageSY($im));
	}else{//gif가 아니라면
		$dstimg=ImageCreateTrueColor($per_w,$per_h);
		$color_white=ImageColorAllocate($dstimg,255,255,255);			
		ImageFill ($dstimg,0,0,$color_white);
		ImageCopyResampled($dstimg,$im,-$move_w,-$move_h,0,0,$infor_w,$infor_h,ImagesX($im),ImagesY($im));
		
	}			

	ImageJPEG($dstimg,$filename,$qul);//썸네일생성 완료

	if($w_mark_png) {//만든 썸네일에 png 워터마크 찍기
		$mark=imagecreatefrompng($w_mark_png);		
		$dstimg=ImageCreateFromJPEG($filename);		
		ImageCopyResampled($dstimg,$mark,-$move_w,-$move_h,0,0,ImagesX($mark),ImagesY($mark),ImagesX($mark),ImagesY($mark));
		ImageJPEG($dstimg,$filename,$qul);
		
	}

	@chmod($filename,0707);
		
	return $filename;

	ImageDestroy($dstimg);
	ImageDestroy($im);		
}



유창화님경우 썸네일의 대가로 계시지만,

나름 그냥 만든거라 사용중입니다만, 참고되시라는 의미로 올려놓았습니다. 그리고 사용방법이라면

$img=rims_thumb("원이미지경로","가로크기","가로:세로","썸네일만들경로포함된이미지이름",'워터마크찍을png이미지경로')

<img src="<?=$img?>">


가로크기와 가로:세로 비율이 같이 사용된 이유는 가로 120에 4:3으로 주거나 가로 120에 2:1로 주거나 하는 경우이고, 원하는 가로 세로크기일 경우 가로 120에 120:105 이렇게 줘도 가능하기때문에 같이 사용됩니다.

[추가]: 원본비율 그대로 값: 1

참고로 퀄러티가 높은 썸네일을 만든다하여 (위 주석참고) 90이상으로 주게되면 용량이 커져 부담이 될겁니다. 이경우 웹검색을 통해 sharpen 함수가 따로 있어 그를 적절히 이용하면 썸네일에 선명함을 더할수 있습니다. 다만, 만드는 시간이 다소 걸릴수 있습니다.


위 함수코드에 대한 설명은 길게 차지하는 가운데(26~91 line)가 재료를 가지고 가로세로에 따른 절차정도로 밖에 안되므로 이해안하셔도 상관없습니다. 사실 별 도움안되는 부분일수 있습니다.

위 함수에서 이해하는데 도움이 된다면 상단부와 하단부만 주의깊게 보시면 됩니다.

워터 마크경우도 썸네일만드는 과정과 똑같습니다. 썸네일은 백지에 복사하여 만다는 것이라면, 일부로 공간을 만들필요없이 만들어진 썸네일위에 이미지를 하나더 복사하는 것이니까요.

어떤 이미지 속성이냐, 그에따라 백지든 흑지는 어떻게 사용하느냐, 그리고 그 속성에 따라 어떻게 복사를 하느냐 차이가 됩니다.

강좌중 다른일로 급하게 작성했습니다만, 부족하더라도 이해해주시고 공부하는 의미로 질문주시거나 의견주시면 답변드리겠습니다.

댓글목록

마스터koo님의 댓글

마스터koo 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물

오늘 일이 많고 개인적으로 어디다녀오느라 글 보고서도 확인이 늦었네요! 이번에 올려주신거 감사드립니다.
오늘 제가 실제로 구동을 해봐야 감이 올텐데 아직 해보지 못해서 아쉽습니다 ㅠㅠ

꼭 구동해보고 궁금한거 문의하겠습니다 ㅎㅎ

rimsoft님의 댓글

rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글

ㅎㅎ
그냥 이런게 있구나 이렇게 이해하셔도 괜찮습니다.
다음강좌부터는 좀더 실용적?이고, 도움이 되는걸로 시작하겠습니다.

INBEST님의 댓글

INBEST 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물

고수님들이 만든 썸네일 소스를 습관적으로 붙여 사용했는데...
림스님의 소스와 사용중인 소스를 차분히 비교해보고 이해해 보렵니다.

++ 워터마크 찍기를 집중해서, 어렵내요 !! -_-"

감사 !!

Total 18건 1 페이지
PHP 강좌 목록
번호 제목 글쓴이 날짜 조회
공지 강좌 들어가기전에.. 댓글6 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 02-11 3162
17 php 초급에서 반드시 짜 보아야 할 것들 댓글1 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 07-09 3680
16 알고리즘과 경우의 수 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 06-02 3380
15 그누보드 게시판 테이블 그리고 댓글 댓글2 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 05-02 6814
14 웹표준? 댓글2 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 04-13 2940
13 특강. [그누보드를 알자4] 그누보드 스킨(board-list.skin.php) 댓글2 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 04-07 6085
12 특강. [그누보드를 알자3] 그누보드 스킨(board-write.skin.php) 댓글2 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 03-21 22250
11 특강. [그누보드를 알자2] 그누보드 스킨 댓글3 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 03-14 8515
10 특강. [그누보드를 알자1] 그누보드 루트파일들 댓글3 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 03-08 7529
열람중 7강. 썸네일 댓글5 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 03-07 3274
8 6강. 중간 마무리 댓글2 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 03-03 2310
7 5강. html에서 form 개념과 php, mysql 연관성 댓글3 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 02-27 4555
6 4강. [문법] 반복문 for, while 댓글7 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 02-25 3251
5 [그누보드관련] 쉬는 타임 댓글3 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 02-21 3368
4 3강. [문법] 조건문 if, else, elseif, switch 인기글 rimsoft 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 02-18 10939
게시물 검색

접속자집계

오늘
28
어제
82
최대
425
전체
358,810
그누보드5

림소프트 / 515-08-36933 / 제2014-경북경산-00079 / 양명주 / ifnelse@gmail.com
© Copyright rimsoft.co.kr . All Rights Reserved.

댓글이 달렸습니다.

모바일 버전으로 보기