GD 라이브러리를 이용한 섬네일 이미지 만들기 [텍스트 삽입] > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

GD 라이브러리를 이용한 섬네일 이미지 만들기 [텍스트 삽입] 정보

GD 라이브러리를 이용한 섬네일 이미지 만들기 [텍스트 삽입]

본문

<?php
// 설정 및 원본 파일
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
$r_filename = 'img.jpg'; // 원본파일
$r_last_name = "_thumbnail"; // 섬내일 이름변경
$r_save_root = "."; // 저장장소

// 텍스트 설정
$r_font = $r_save_root."/timesi.ttf"; // 서체 설정(유니코드 지원서체가 있어야만 한글이 안깨짐)
$r_tred = 0; // 텍스트 색상설정 적색
$r_tgreen = 0; // 텍스트 색상설정 녹색
$r_tblue = 0; // 텍스트 색상설정 청색
$r_talpha = 10; // 텍스트 투명도 (0~127)
$r_string = "Photo by RINIX"; // 삽입할 텍스트
$r_string = iconv("EUC-KR", "UTF-8", $r_string); // 한글사용시 깨짐현상을 막기 위해 유니코드로 변환
$r_fontsize = 9; // 폰트사이즈
$r_pad = 5; // 여백
$r_angle = 0; // 각도 조절 +(반시계방향) -(시계방향)
$r_loc = 3; // 위치값 0 = 좌측상단, 1 = 우측상단, 2 = 좌측하단, 3 = 우측하단

// 텍스트 박스 설정
$r_bred = 250; // 텍스트 박스 색상설정 적색
$r_bgreen = 250; // 텍스트 박스 색상설정 녹색
$r_bblue = 250; // 텍스트 박스 색상설정 청색
$r_balpha = 25; // 텍스트 박스 투명도 (0~127)

// 썸내일 크기
$r_img_width = 150; // 가로
$r_img_height = 200; // 세로

// 이미지 컷팅위치 0~10 까지
$r_xcut = 5;
$r_ycut = 2;

// jpg일경우 압축률
$r_zip = 100;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

// 파일이름 변경
$r_file_name = explode(".", $r_filename);
$r_cnt_name = count($r_file_name)-1;

// 파일이름에서 확장자를 제외한 순수이름에 "_thumbnail"를 붙인다.
for($i=0; $i<$r_cnt_name; $i++){
 if($i > 0) $r_re_name = ".".$r_re_name;
 $r_re_name = $r_re_name.$r_file_name[$i];
}
$r_re_name = $r_re_name.$r_last_name;

// GD 버젼체크
$r_gd = gd_info();
$r_gdver = substr(preg_replace("/[^0-9]/", "", $r_gd['GD Version']), 0, 1);
if(!$r_gdver){
 echo "GD 버젼체크 실패거나 GD 버젼이 1 미만입니다.";
 echo "<br>GD 버젼 $gdver";
 exit;
}

// 이미지 비률 수정및 이미지 포멧방식 체크
list($r_width, $r_height, $r_img_type) = getimagesize($r_filename);

// 확장자가 GIF,JPG,PNG 가 안일시에 에러메시지 출력
if($r_img_type<1 && $r_img_type > 3){
    echo "GIF,JPG,PNG 가 아닙니다.";
 exit;
}

// 이미지 크기 검사
if($r_img_width < $r_width && $r_img_height < $r_height){ // 섬내일 가로, 세로 크기보다 이미지 가로, 세로 크기가 모두 클때
 // 가로 크기를 기준으로 섬네일 가로크기비률에 맞춰 사이즈를 조정한다.
 $r_percent = $r_width / $r_img_width;
 $r_new_width = $r_width / $r_percent;
 $r_new_height = $r_height / $r_percent; 
 // 위에서 사이즈 조정을 했을시 여백이 생긴다면 다시 세로를 기준으로 사이즈를 조정한다.
 if($r_img_height > $r_new_height){
  $r_percent = $r_height / $r_img_height;
  $r_new_width = $r_width / $r_percent;
  $r_new_height = $r_height / $r_percent; 
 }
}else if($r_img_width > $r_width && $r_img_height > $r_height){ // 섬내일 가로, 세로 크기보다 이미지 가로, 세로 크기가 모두 작을때
 // 생성될 이미지 사이즈와 원본이미지 사이즈의 크기를 모두 같이 설정한다. 이때 섬네일 사이즈는 무시한다.
 $r_img_width = $r_width;
 $r_img_height = $r_height;
 $r_new_width = $r_width;
 $r_new_height = $r_height;
}else{ // 섬내일 가로, 세로 크기보다 이미지 가로 또는 세로 어느한쪽이 크거나 작을때
 $r_new_width = $r_width;
 $r_new_height = $r_height;

// 섬내일과 축소된이미지의 가로 크기를 비교하여 잘라낼 위치를 찾는다.
if($r_img_width == $r_new_width){
 $r_over_width = 0;
}else{
 $r_over_width = ($r_img_width - $r_new_width)*($r_xcut/10);
}
// 섬내일과 축소된이미지의 세로 크기를 비교하여 잘라낼 위치를 찾는다.
if($r_img_height == $r_new_height){
 $r_over_height = 0;
}else{
 $r_over_height = ($r_img_height - $r_new_height)*($r_ycut/10);
}

// 기본바탕색의 지정된 섬내일 사이즈의 이미지틀을 만든다.(PHP 4 >= 4.0.6, PHP 5)
$r_image_p = imagecreatetruecolor($r_img_width, $r_img_height); //이 함수는 GD 2.0.1 이상이 필요합니다. (2.0.28 이상을 권장합니다)

// 확장자를 구별하여 이미지 포멧을 변환한다. (PHP 4, PHP 5)
if($r_img_type == 1){
 $r_image = imagecreatefromgif($r_filename);
}else if($r_img_type == 2){
 $r_image = imagecreatefromjpeg($r_filename);
}else if($r_img_type == 3){
 $r_image = imagecreatefrompng($r_filename);
}

// 원본이미지의 사이즈를 위에서 계산된 비률에 맞게 사이즈를 축소하고 섬내일 크기로 잘라낸다. (PHP 4 >= 4.0.6, PHP 5)
$r_image_s = imagecopyresampled($r_image_p, $r_image, $r_over_width, $r_over_height, 0, 0, $r_new_width, $r_new_height, $r_width, $r_height);

// 텍스트 크기 확인 (PHP 4, PHP 5)
$r_box = imagettfbbox($r_fontsize, 0, $r_font, $r_string);
// imagettfbbox() 배열원소 인덱스값(px단위)
// 인덱스 0 => 좌측 하단의 X좌표의 값
// 인덱스 1 => 좌측 하단의 Y좌표의 값
// 인덱스 2 => 우측 하단의 X좌표의 값
// 인덱스 3 => 우측 하단의 Y좌표의 값
// 인덱스 4 => 우측 상단의 X좌표의 값
// 인덱스 5 => 우측 상단의 Y좌표의 값
// 인덱스 6 => 좌측 상단의 X좌표의 값
// 인덱스 7 => 좌측 상단의 Y좌표의 값

$r_box_width = abs($r_box[2] - $r_box[0]);
$r_box_height = abs($r_box[5] - $r_box[3]);

// 박스 위치 확인
if($r_loc < 2){
 // 박스 우측 상단 포인트
 $r_tbox_ltx = 0;
 $r_tbox_lty = 0;
 // 박스 좌측 하단 포인트
 $r_tbox_rbx = $r_img_width;
 $r_tbox_rby = $r_box_height + $r_pad*2 ;
}else{
 // 박스 우측 상단 포인트
 $r_tbox_ltx = 0;
 $r_tbox_lty = $r_img_height - $r_box_height - $r_pad*2;
 // 박스 좌측 하단 포인트
 $r_tbox_rbx = $r_img_width;
 $r_tbox_rby = $r_img_height;
}

// 텍스트 박스 컬러 (RGB 컬러) PHP 4 >= 4.3.2, PHP 5
$r_tbox_color = imagecolorallocatealpha($r_image_p, $r_bred, $r_bgreen, $r_bblue, $r_balpha);

// 텍스트 박스 (PHP 4, PHP 5)
imagefilledrectangle($r_image_p, $r_tbox_ltx, $r_tbox_lty, $r_tbox_rbx, $r_tbox_rby, $r_tbox_color);

// 여백을 포함한 텍스트 영역이 이미지 보다 크다면 에러메세지 출력.
$r_wspace = $r_box_width + $r_pad*2;
$r_hspace = $r_box_height + $r_pad*2;
if($r_img_width <  $r_wspace or $r_img_height <  $r_hspace){
 echo "여백을 포함한 텍스트 영역이 썸네일 크기보다 큽니다.";
 exit;
}

// 위치에 맞게 여백값을 구한다.
if($r_loc == 0){
 // 좌측상단기준 (텍스트의 좌표포인트는 좌측 하단이다.)
 $r_xpad = $r_pad;
 $r_ypad = $r_pad + $r_box_height; // 기본여백값에 높이 값을 더해준다.
}
if($r_loc == 1){
 // 우측상단기준
 $r_xpad = $r_img_width - $r_pad - $r_box_width; // 섬네일 이미지 가로크기에서 기본여백값과 텍스트 가로길이값을 빼준다.
 $r_ypad = $r_pad + $r_box_height;
}
if($r_loc == 2){
 // 좌측하단기준 (텍스트의 좌표포인트는 좌측 하단이다.)
 $r_xpad = $r_pad;
 $r_ypad = $r_img_height - $r_pad; // 섬네일 이미지 세로크기에서 기본여백값을 빼준다.
}
if($r_loc == 3){
 // 우측하단기준
 $r_xpad = $r_img_width - $r_pad - $r_box_width; // 섬네일 이미지 가로크기에서 기본여백값과 텍스트 가로길이값을 빼준다.
 $r_ypad = $r_img_height - $r_pad; // 섬네일 이미지 세로크기에서 기본여백값을 빼준다.
}

// 텍스트 컬러 (RGB 컬러) PHP 4 >= 4.3.2, PHP 5
$r_tcolor = imagecolorallocatealpha($r_image_p, $r_tred, $r_tgreen, $r_tblue, $r_talpha);

// 텍스트 삽입 (PHP 4, PHP 5)
imagettftext($r_image_p, $r_fontsize, $r_angle, $r_xpad, $r_ypad-($r_fontsize/3.57), $r_tcolor, $r_font, $r_string);
// 아래 주석은 이미지 크기에 맞도록 박스선을 그리는 것으로 폰트에 따른 오차 값을 잡기 위함이다. 타임스뉴로만서체는 위로 서체크기/3.57 만큼 올라가야함.
//imagerectangle($r_image_p, $r_xpad, $r_ypad-$r_box_height, $r_xpad+$r_box_width, $r_ypad, $r_tcolor);

// 포멧에 맞추어 이미지를 저장한다. (PHP 4, PHP 5)
if($r_img_type == 1){
 $r_re_name = $r_save_root."/".$r_re_name.".gif";
 imagegif($r_image_p, $r_re_name);
}else if($r_img_type == 2){
 $r_re_name = $r_save_root."/".$r_re_name.".jpg";
 imagejpeg($r_image_p, $r_re_name, $r_zip);
}else if($r_img_type == 3){
 $r_re_name = $r_save_root."/".$r_re_name.".png";
 imagepng($r_image_p, $r_re_name);
}

// 메모리에 있는 그림 삭제 (PHP 4, PHP 5)
imagedestroy($r_image_p);

//이미지를 출력한다.
echo "<img src='$r_re_name'>";
?>

추천
2

댓글 2개

전체 8 |RSS
그누4 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT