-
-
/** 썸네일 생성 클래스, imagemagick 및 gd 라이브러리 처리 모두 지원 - * 날짜: 2013 -07-15
- * 작성자: fdipzone
- * 버전: 1.2
- * 편집: bbs.it-home.org
- * 기능:
- * public set_config: 매개변수 설정
- * public create_thumb: 썸네일 이미지 생성
- * private fit: 썸네일 이미지
- * 비공개 자르기: 자르기 이미지
- * private gd_fit: GD 라이브러리 썸네일 이미지
- * private gd_crop: GD 라이브러리 자르기 이미지
- * private get_size: 변환할 크기 가져오기
- * private get_crop_offset: 자르기 오프셋 가져오기
- * private add_watermark: 워터마크 추가
- * private check_handler: 핸들러 설치 여부 확인
- * private create_dirs: 디렉토리 생성
- * private presents: 매개변수 존재 여부 확인
- * private to_log: 로그 기록
- * private hex2rgb: 16진수 색상을 rgb 색상으로 변환
- * private get_file_ext: 이미지 가져오기 유형
- *
- * 버전: 1.1 GD 라이브러리 처리 추가
- * 버전: 1.2 너비 및 높이 매개변수 처리 추가
- * 이미지 색공간이 RGB가 아닌 경우 RGB 처리로 변환 추가
- * 사용법 수정 크롭을 gif로 저장할 때 투명 무효 영역 문제가 있습니다. repage 매개변수를 사용하여 투명 무효 영역을 삭제하세요
- *
- * 팁: imagemagick 사용을 권장합니다
- * GD 라이브러리는 지원하지 않습니다. 투명 워터마크를 사용해야 하는 경우 워터마크 이미지를 투명하게 만드세요.
- * GD 라이브러리에서 투명 워터마크가 포함된 gif를 출력하는 경우 문제가 발생합니다.
- */
-
- class PicThumb{ // 클래스 시작
-
- private $_log = null; // 로그 파일
- private $_handler = null; imagemagick/gd library
- private $_type = 'fit'; // 맞추기 또는 자르기
- private $_source = null; // 원본 이미지 경로
- private $_dest = null; private $_watermark = null; // 워터마크 이미지
- private $_opacity = 75; // 워터마크 이미지 투명도, gd 라이브러리는 지원하지 않습니다.
- private $_gravity = 'SouthEast' // 워터마크 배치 위치 NorthWest, North NorthEast, West, Center, East, SouthWest, South, SouthEast
- private $_geometry = ' 10 10'; // 워터마크 위치 지정, gd 라이브러리는 지원하지 않습니다.
- private $_croppos = 'TL' // 스크린샷 위치 TL TM TR ML MM MR BL BM BR
- private $_bgcolor = null; // 채워진 배경색
- private $_quality = 90; // 생성된 이미지 품질
- private $_width = null; Area width
- private $_height = null; // 영역 높이 지정
-
-
- // 초기화
- public function __construct($logfile=''){
- if( $logfile !=''){
- $this->_log = $logfile;
- }
- }
-
-
- // 매개변수 설정
- 공용 함수 set_config($ param= array()){
- $this->_handler = $this->exists($param, 'handler')? strtolower($param['handler']) : null; ;_type = $this->exists($param, 'type')? strtolower($param['type']) : 'fit'
- $this->_watermark = $this-> $param, '워터마크']: null
- $this->_opacity = $this->exists($param, 'opacity')? : 75; $this->_gravity = $this->exists($param, 'gravity')? $param['gravity'] : 'SouthEast'; $this->exists($param, '기하학')? $param['geometry'] : ' 10 10'
- $this->_croppos = $this->exists($param, 'croppos ')? $param['croppos'] : 'TL';
- $this->_bgcolor = $this->exists($param, 'bgcolor')?
- $this->_quality = $this->exists($param, 'quality')? $param['quality'] : 90
- $this->_width = $this- > 존재($param, '너비')? $param['너비'] : null
- $this->_height = $this->exists($param, '높이')? '] : null;
- }
-
- /**썸네일 이미지 생성
- * @param String $source 원본 이미지
- * @param String $dest 대상 이미지
- * @return boolean
- */
- public function create_thumb($source, $dest){
-
- // 사용 여부를 확인합니다. 핸들러가 설치되었습니다
- if(!$this->check_handler()){
- $this->to_log('핸들러가 설치되지 않았습니다')
- return false; 🎜> // 해당 영역의 너비와 높이가 올바른지 확인
- if(!is_numeric($this->_width) || !is_numeric($this->_height) || $this->_width< ;=0 | $this->_height<=0){
- $this->to_log('너비 또는 높이가 잘못됨')
- return false; // 판단 소스 파일 존재 여부
- if(!file_exists($source)){
- $this->to_log($source.' not presents')
- return false;
-
- // 대상 파일 경로 생성
- if(!$this->create_dirs($dest)){
- $this->to_log(dirname($dest).' 생성 실패' );
- return false;
-
- $this->_source = $source; // 소스 파일
- $this->_dest = $dest; 🎜>
- // 이미지 처리
- switch($this->_type){
- case 'fit':
- if($this->_handler=='imagemagick'){
- return $this- >fit();
- }else{
- return $this->gd_fit()
- }
- break;
-
-
- if( $this->_handler=='imagemagick'){
- return $this->crop()
- }else{
- return $this->gd_crop();
- }
- break;
-
- 기본값:
- $this->to_log($this->_type.' 적합하지 않고 자르기')
- return false; > }
-
- }
-
-
- /**이미지를 비례적으로 압축하거나 늘입니다
- * @return boolean
- */
- private function fit(){
-
- // 배경을 채울지 결정
- $bgcolor = ($this- > _bgcolor!=null)
- sprintf(" -배경 '%s' -중력 중심 -extent '%sx%s' ", $this->_bgcolor, $this->_width, $this- > _height) : "";
-
- // RGB로 변환 여부 결정
- $source_info = getimagesize($this->_source)
- $colorspace = (!isset($source_info) [' 채널']) || $source_info['channels']!=3)? ' -colorspace RGB ': ''
-
- // 명령줄
- $cmd = sprintf("convert - 크기 조정 ' %sx%s' '%s' %s -quality %s %s '%s'", $this->_width, $this->_height, $this->_source, $bgcolor, $ this- >_quality, $colorspace, $this->_dest)
-
- // 실행된 명령을 기록합니다.
- $this->to_log($cmd)
-
- / / 명령 실행
- exec($cmd);
-
- // 워터마크 추가
- $this->add_watermark($this->_dest)
-
- return is_file($ this- >_dest)? true : false;
-
- }
-
-
- /**이미지 자르기
- * @return boolean
- */
- 비공개 함수 자르기(){
-
- // 생성된 이미지 크기 가져오기
- list($pic_w, $pic_h) = $this->get_size()
-
- // 스크린샷의 오프셋 가져오기
- list($offset_w, $offset_h ) = $this->get_crop_offset($pic_w, $pic_h);
-
- // RGB 변환 여부 결정
- $source_info = getimagesize($this->_source); > $ colorspace = (!isset($source_info['channels']) || $source_info['channels']!=3)? ' -colorspace RGB ': ''
-
- // 명령줄
- $cmd = sprintf("convert -resize '%sx%s' '%s' -quality %s %s -crop %sx%s %s %s repage '%s'", $pic_w, $pic_h, $this ->_source, $this->_quality, $colorspace, $this->_width, $this->_height, $offset_w, $offset_h, $this->_dest)
-
- / / 실행된 명령을 기록
- $this->to_log($cmd)
-
- // 명령 실행
- exec($cmd)
-
- // 추가 watermark
- $this->add_watermark($this->_dest);
-
- return is_file($this->_dest)? true : false;
-
- /**GD 라이브러리는 이미지를 비례적으로 압축하거나 늘립니다
- * @return boolean
- */
- private function gd_fit(){
-
- // 생성된 이미지 크기 가져오기
- list($pic_w, $pic_h) = $this -> get_size();
-
- list($owidth, $oheight, $otype) = getimagesize($this->_source)
-
- 스위치($otype) 사례 1: $source_img = imagecreatefromgif($this->_source);
- 사례 2: $source_img = imagecreatefromjpeg($this->_source)
- 사례 3: $source_img = imagecreatefrompng( $this- >_source);
- 기본값: return false
- }
-
- // 이미지를 비례적으로 축소/늘리기
- $new_img = imagecreatetruecolor($pic_w, $pic_h) ;
- imagecopyresampled($new_img, $source_img, 0, 0, 0, 0, $pic_w, $pic_h, $owidth, $oheight)
-
- // 배경 채우기 여부 결정
- if($ this->_bgcolor!=null){
- $bg_img = imagecreatetruecolor($this->_width, $this->_height)
- $rgb = $this->hex2rgb($ this-> ;_bgcolor);
- $bgcolor =imagecolorallocate($bg_img, $rgb['r'], $rgb['g'], $rgb['b'])
- imagefill($bg_img , 0, 0, $bgcolor);
- imagecopy($bg_img, $new_img, (int)(($this->_width-$pic_w)/2), (int)(($this->_height -$pic_h )/2), 0, 0, $pic_w, $pic_h);
- $new_img = $bg_img;
- }
-
- // 대상 이미지 유형 가져오기
- $ dest_ext = $this ->get_file_ext($this->_dest)
-
- // 이미지 생성
- switch($dest_ext){
- 사례 1: imagegif($new_img, $this- >_dest, $this->_quality); break;
- 사례 2: imagejpeg($new_img, $this->_dest, $this->_quality)
- imagepng( $new_img, $ this->_dest, (int)(($this->_quality-1)/10)) break;
- imagedestroy ($source_img);
- }
-
- if(isset($new_img)){
- imagedestroy($new_img)
- }
-
- // 추가 watermark
- $this->add_watermark($this->_dest)
-
- return is_file($this->_dest)? true
-
- }
-
-
- /**GD 라이브러리 크롭 이미지
- * @return boolean
- */
- private function gd_crop(){
-
- // 생성된 이미지 크기 가져오기
- list($pic_w, $pic_h) = $this->get_size();
-
- // 스크린샷의 오프셋 가져오기
- list($offset_w, $offset_h) = $this->get_crop_offset($pic_w, $pic_h);
-
- list($owidth, $oheight, $otype) = getimagesize($this->_source)
-
- switch($otype){
- 사례 1: $source_img = imagecreatefromgif ($this->_source);
- 사례 2: $source_img = imagecreatefromjpeg($this->_source)
- 사례 3: $source_img = imagecreatefrompng($this->_source) ; break;
- 기본값: return false
- }
-
- // 이미지를 비례적으로 축소/늘리기
- $tmp_img = imagecreatetruecolor($pic_w, $pic_h)
- imagecopyresampled tmp_img, $source_img, 0, 0, 0, 0, $pic_w, $pic_h, $owidth, $oheight)
-
- // 이미지 자르기
- $new_img = imagecreatetruecolor($this-> ; _width, $this->_height)
- imagecopyresampled($new_img, $tmp_img, 0, 0, $offset_w, $offset_h, $this->_width, $this->_height, $this-> ; _width, $this->_height);
-
- // 대상 이미지의 유형을 가져옵니다.
- $dest_ext = $this->get_file_ext($this->_dest)
-
- // 이미지 생성
- switch($dest_ext){
- 사례 1: imagegif($new_img, $this->_dest, $this->_quality)
- 사례 2: imagejpeg; ( $new_img, $this->_dest, $this->_quality); break
- 사례 3: imagepng($new_img, $this->_dest, (int)(($this->_quality; - 1)/10)); break;
- }
-
- if(isset($source_img)){
- imagedestroy($source_img);
-
- if( isset($tmp_img)){
- imagedestroy($tmp_img);
- }
-
- if(isset($new_img)){
- imagedestroy($new_img)
- >
- // 워터마크 추가
- $this->add_watermark($this->_dest)
-
- return is_file($this->_dest)? true : false;
- }
-
-
- /**대상 이미지에 의해 생성된 크기를 가져옵니다
- * @return Array $width, $height
- */
- 비공개 함수 get_size(){
- list($owidth, $oheight) = getimagesize($this->_source ) ; $width = (int)($this->_width)
- $height = (int)($this->_height)
-
- 스위치($this-> ; _type){
- 케이스 '맞춤':
- $pic_w = $width;
- $pic_h = (int)($pic_w*$oheight/$owidth)
- if($pic_h>$ height ){
- $pic_h = $height;
- $pic_w = (int)($pic_h*$owidth/$oheight)
- }
- break; 🎜 > if($owidth>$oheight){
- $pic_h = $height;
- $pic_w = (int)($pic_h*$owidth/$oheight)
- }else{
- $ pic_w = $width;
- $pic_h = (int)($pic_w*$oheight/$owidth);
- }
- break
- }
-
- return array($pic_w, $ pic_h)
- }
-
-
- /**스크린샷의 오프셋 가져오기
- * @param int $pic_w 이미지 너비
- * @param int $pic_h 이미지 높이
- * @return Array $offset_w, $offset_h
- */
- 비공개 함수 get_crop_offset($pic_w, $pic_h){
- $offset_w = 0;
- $offset_h = 0;
-
- 스위치(strtoupper($this->_croppos)){
- 케이스 'TL':
- $offset_w = 0;
- $offset_h = 0;
- 휴식;
-
- 케이스 'TM':
- $offset_w = (int)(($pic_w-$this->_width)/2);
- $offset_h = 0;
- 휴식;
-
- 케이스 'TR':
- $offset_w = (int)($pic_w-$this->_width);
- $offset_h = 0;
- 휴식;
-
- 사례 'ML':
- $offset_w = 0;
- $offset_h = (int)(($pic_h-$this->_height)/2);
- 휴식;
-
- 케이스 'MM':
- $offset_w = (int)(($pic_w-$this->_width)/2);
- $offset_h = (int)(($pic_h-$this->_height)/2);
- 휴식;
-
- 사례 'MR':
- $offset_w = (int)($pic_w-$this->_width);
- $offset_h = (int)(($pic_h-$this->_height)/2);
- 휴식;
-
- 케이스 'BL':
- $offset_w = 0;
- $offset_h = (int)($pic_h-$this->_height);
- 휴식;
-
- 케이스 'BM':
- $offset_w = (int)(($pic_w-$this->_width)/2);
- $offset_h = (int)($pic_h-$this->_height);
- 휴식;
-
- 케이스 'BR':
- $offset_w = (int)($pic_w-$this->_width);
- $offset_h = (int)($pic_h-$this->_height);
- 휴식;
- }
-
- return array($offset_w, $offset_h);
- }
-
-
- /**워터마크 추가
- * @param String $dest 이미지 경로
- */
- 비공개 함수 add_watermark($dest){
- if($this->_watermark!=null && file_exists($ this->_watermark) && file_exists($dest)){
- list($owidth, $oheight, $otype) = getimagesize($dest);
- list($w, $h, $wtype) = getimagesize($this->_watermark);
-
- // 水印图比原图要小才加水印
- if($w<=$owidth && $h<=$oheight){
-
- if($this-> ;_handler=='imagemagick'){ // imagemagick 添加水印
-
- $cmd = sprintf("composite -gravity %s -geometry %s -dissolve %s '%s' %s %s", $ this->_gravity, $this->_geometry, $this->_opacity, $this->_watermark, $dest, $dest);
-
- $this->to_log($cmd);
-
- exec($cmd);
-
- }else{ // gd 添加水印
-
- switch($wtype){
- 사례 1: $water_img = imagecreatefromgif($this->_watermark); 부서지다;
- 사례 2: $water_img = imagecreatefromjpeg($this->_watermark); 부서지다;
- 사례 3: $water_img = imagecreatefrompng($this->_watermark); 부서지다;
- 기본값: false를 반환합니다.
- }
-
- 스위치($otype){
- 사례 1: $dest_img = imagecreatefromgif($dest); 부서지다;
- 사례 2: $dest_img = imagecreatefromjpeg($dest); 부서지다;
- 사례 3: $dest_img = imagecreatefrompng($dest); 부서지다;
- 기본값: false를 반환합니다.
- }
-
- // 水印位置
- switch(strtolower($this->_gravity)){
- case 'northwest':
- $posX = 0;
- $posY = 0;
- 휴식;
- 케이스 '북쪽':
- $posX = ($owidth - $w) / 2;
- $posY = 0;
- 휴식;
- '북동쪽' 사례:
- $posX = $owidth - $w;
- $posY = 0;
- 휴식;
- 케이스 'west':
- $posX = 0;
- $posY = ($oheight - $h) / 2;
- 휴식;
- 케이스 'center':
- $posX = ($owidth - $w) / 2;
- $posY = ($oheight - $h) / 2;
- 휴식;
- 케이스 '동쪽':
- $posX = $owidth - $w;
- $posY = ($oheight - $h) / 2;
- 휴식;
- 케이스 'southwest':
- $posX = 0;
- $posY = $o높이 - $h;
- 휴식;
- 케이스 '남쪽':
- $posX = ($owidth - $w) / 2;
- $posY = $o높이 - $h;
- 휴식;
- 케이스 '남동쪽':
- $posX = $owidth - $w;
- $posY = $o높이 - $h;
- 휴식;
- }
-
- imagealphablending($dest_img, true);
- imagecopy($dest_img, $water_img, $posX, $posY, 0, 0, $w, $h);
-
- 스위치($otype){
- 케이스 1:imagegif($dest_img, $dest, $this->_quality); 부서지다;
- 사례 2:imagejpeg($dest_img, $dest, $this->_quality); 부서지다;
- 사례 3:imagepng($dest_img, $dest, (int)(($this->_quality-1)/10)); 부서지다;
- }
-
- if(isset($water_img)){
- imagedestroy($water_img);
- }
-
- if(isset($dest_img)){
- imagedestroy($dest_img);
- }
-
- }
- }
- }
- }
-
-
- /**핸들러 설치 여부 확인
- * @return boolean
- */
- 비공개 함수 check_handler(){
-
- $handler = $this->_handler;
-
- if(!in_array($handler, array('imagemagick', 'gd', null))){
- return false;
- }
-
- // 检查是否有安装imagemagick
- $imagemagick_installed = strstr(shell_exec('convert -version'),'Version: ImageMagick')!=''? 사실 : 거짓;
-
- // 检查是否有安装gd库
- $gd_installed = function_exists('gd_info')? 사실 : 거짓;
-
- 스위치($handler){
- 케이스 'imagemagick':
- return $imagemagick_installed;
- 휴식;
-
- 케이스 'gd':
- return $gd_installed;
- 휴식;
-
- 케이스 null:
- if($imagemagick_installed){
- $this->_handler = 'imagemagick';
- true를 반환합니다.
- }
-
- if($gd_installed){
- $this->_handler = 'gd';
- true를 반환합니다.
- }
- 휴식;
- }
-
- false를 반환합니다.
- }
-
-
- /**이미지 디렉토리 생성
- * @param String $path
- * @return boolean
- */
- 비공개 함수 create_dirs($dest){
- if(!is_dir(dirname($dest))){
- return mkdir(dirname($dest), 0777, true);
- }
- true를 반환합니다.
- }
-
-
- /**매개변수 존재 여부 확인
- * @param Array $obj 배열 객체
- * @param String $key 찾을 키
- * @return boolean
- */
- 개인 함수가 존재합니다($obj,$key=''){
- if($key=='') {
- return isset($obj) && !empty($obj);
- }else{
- $keys = 폭발('.',$key);
- for($i=0,$max=count($keys); $i if(isset($obj[$keys[$i]])){
- $obj = $obj[$keys[$i]];
- }else{
- false를 반환합니다.
- }
- }
- return isset($obj) && !empty($obj);
- }
- }
-
-
- /**로그 기록
- * @param String $msg 기록할 로그 메시지
- */
- 비공개 함수 to_log($msg){
- if($this->_log){
- $msg = '['.date('연월일 H:i:s').']'.$msg."rn";
- file_put_contents($this->_log, $msg, FILE_APPEND);
- }
- }
-
-
- /**16진수 색상을 RGB 색상으로
- * @param String $color 16진수 색상
- * @return 배열
- */
- 비공개 함수 hex2rgb($hexcolor){
- $color = str_replace('#', '' , $hexcolor);
- if (strlen($color) > 3) {
- $rgb = array(
- 'r' => hexdec(substr($color, 0, 2)),
- 'g ' => hexdec(substr($color, 2, 2)),
- 'b' => hexdec(substr($color, 4, 2))
- );
- } else {
- $r = substr($color, 0, 1) . substr($color, 0, 1);
- $g = substr($color, 1, 1) . substr($color, 1, 1);
- $b = substr($color, 2, 1) . substr($color, 2, 1);
- $rgb = array(
- 'r' => hexdec($r),
- 'g' => hexdec($g),
- 'b' => hexdec($ b)
- );
- }
- $rgb 반환;
- }
-
-
- /**이미지 유형 가져오기
- * @param String $file 이미지 경로
- * @return int
- */
- 비공개 함수 get_file_ext($file){
- $filename = basename($file);
- list($name, $ext)= 폭발('.', $filename);
-
- $ext_type = 0;
-
- 스위치(strtolower($ext)){
- 케이스 'jpg':
- 케이스 'jpeg':
- $ext_type = 2;
- 휴식;
- 케이스 'gif':
- $ext_type = 1;
- 휴식;
- 케이스 'png':
- $ext_type = 3;
- 휴식;
- }
-
- return $ext_type;
- }
-
- } // 수업 종료
-
- ?>
- 데모:
- [php] 일반 사본 보기
- define('ROOT', dirname(__FILE__));
-
- require(ROOT."/PicThumb.class.php");
-
- $logfile = ROOT.'/PicThumb.log';
- $source1 = ROOT.'/pic/source.jpg';
- $dest1 = ROOT.'/pic/1.jpg';
- $dest2 = ROOT.'/pic/2.gif';
- $dest3 = ROOT.'/pic/3.png';
-
- $source2 = ROOT.'/pic/source_cmyk.jpg';
- $dest4 = ROOT.'/pic/4.jpg';
- $dest5 = ROOT.'/pic/5.gif';
- $dest6 = ROOT.'/pic/6.png';
-
- $watermark = ROOT.'/pic/watermark.png';
-
- // 按比例生成缩略图
- $param = array(
- 'type' => 'fit',
- 'width' => 100,
- 'height ' => 100,
- );
-
- $obj = 새 PicThumb($logfile);
- $obj->set_config($param);
- $flag = $obj->create_thumb($source1, $dest1);
-
- if($flag){ //bbs.it-home.org
- echo '';
- }else{
- echo '썸네일 만들기 실패';
- }
-
- // 按比例生成缩略图,不足부분분용#FF0000填充
- $param = array(
- 'type' => 'fit',
- 'width ' => 100,
- '높이' => 100,
- 'bgcolor' => '#FFFF00'
- );
-
- $obj = 새 PicThumb($logfile);
- $obj->set_config($param);
- $flag = $obj->create_thumb($source1, $dest2);
-
- if($flag){
- echo '';
- }else{
- echo '썸네일 만들기 실패';
- }
-
- // 裁剪250x250적缩略图,裁剪位置是底part中间,水印位置西南,透明島50
- $param = array(
- 'type' => 'crop' ,
- 'croppos' => 'BM',
- '너비' => 250,
- '높이' => > '불투명도' => 50,
- '중력' => '남서부'
- );
-
- $obj = 새 PicThumb($logfile);
- $obj->set_config($param);
- $flag = $obj->create_thumb($source1, $dest3);
-
- if($flag){
- echo '';
- }else{
- echo '썸네일 만들기 실패';
- }
-
- // 按比例生成缩略图 CMYK格式
- $param = array(
- 'type' => 'fit',
- 'width' => 100 ,
- '높이' => 100,
- );
-
- $obj = 새 PicThumb($logfile);
- $obj->set_config($param);
- $flag = $obj->create_thumb($source2, $dest4);
-
- if($flag){
- echo '';
- }else{
- echo '썸네일 만들기 실패';
- }
// 썸네일을 비례적으로 생성하고 누락된 부분을 CMYK 형식의 #FF0000으로 채웁니다.
- $param = array(
- 'type' => 'fit',
- '너비' => 100,
- '높이' => 100,
- 'bgcolor' => '#FFFF00'
- )
-
- $obj = 새 PicThumb($logfile );
- $obj->set_config($param);
- $flag = $obj->create_thumb($source2, $dest5)
-
- if($flag) {
- echo ''
- }else{
- echo '썸네일 생성 실패'
-
- // 250x250 썸네일 자르기, 자르기 위치는 하단 중앙, 워터마크 위치는 남서쪽, 투명도는 50 CMYK 형식
- $param = array(
- 'type' => 'crop ',
- 'croppos' => 'BM',
- '너비' => 250,
- '높이' => 250,
- 'watermark' => $watermark,
- '불투명도 ' => 50,
- '중력' => '남서부'
- )
-
- $obj = new PicThumb($logfile); param );
- $flag = $obj->create_thumb($source2, $dest6);
-
- if($flag){
- echo '';
- }else{
- echo 'create ThumbFail';
- }
- ?>
-
-
-
코드 복사
>>> PHP 썸네일 생성 클래스 소스코드 다운로드 주소
|