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'>";
?>
// 설정 및 원본 파일
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
$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
댓글 2개

친절하게 초보들을 위해 주석 달아주시니 감사할 따름입니다~
제 개인사이트로 좀 퍼갈께요~~
제 개인사이트로 좀 퍼갈께요~~
사용방법좀..