외부의 이미지를 자신의 서버경로에 썸네일 만드는 방법

안녕하세요

요새 관련 내용이 조금 보이길래 한번 만들어봣습니다.

원리는 외부의 이미지를 소켓으로 읽어와서 내 서버에 저장한다.
그런다음 그 서버에 저장된 이미지로 부터 썸네일을 만든다.
썸네일을 만든후 원본 이미지는 삭제한다.
입니다.

전 그냥 샘플을 만드는 정도로 해봣습니다.
응용하셔서 사용하세요.

예제 : http://82da.com/Ybbs/sample/Ymake_sumnail_remoteimage.php
소스 : http://82da.com/Ybbs/sample/source/Yfilereader.php?file=Ymake_sumnail_remoteimage.php

다음은 소스입니다.
----------------------------------------------------------------------
//썸네일 이미지 사이지 결정하여 썸네일 생성
//$src_file_size, $dest_file_size 이미지 정보를 담은 배열 0은 너비 1은 높이
function Ysumnail_rule($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality=90, $lib='gd'){

//생성도중 에러가 날수 있는 것들을 체크 하여 return false
if (!is_array($src_file_size) || !is_array($dest_file_size) || empty($src_file_size[0]) || empty($src_file_size[1]) || empty($dest_file_size[0]) || empty($dest_file_size[0])) {

return false;
}

//$lib 확인후 조건에 맞지 않으면 기본값 세팅
if (empty($lib) || ($lib != 'gd' && $lib != 'netpbm')) $lib = 'gd';

$rate = $src_file_size[1] / $src_file_size[0];
$temp[1] = (int)($dest_file_size[0] * $rate);

if ($dest_file_size[1] < $temp[1]) {

$rate = $src_file_size[0] / $src_file_size[1];
$dest_file_size[0] = (int)($dest_file_size[1] * $rate);
}
else{

$dest_file_size[1] = $temp[1];
}

//썸네일의 너비나 높이가 10 미만인것은 만들지 않는다.
if ($dest_file_size[0] < 10 || $dest_file_size[1] < 10) {

return false;
}

//썸네일 이미지가 원본이미지 크기보다 크게 설정되었을 경우, 원본이미지와 동일하게
if ($dest_file_size[0] > $src_file_size[0]) {

$dest_file_size = $src_file_size;
}

if ($lib == 'netpbm') return Ymake_sumnail_netpbm($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality);
else return Ymake_sumnail_gd($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality);
}

//섬네일 생성
function Ymake_sumnail_gd($src_file, $dest_file, $src_file_size, $dest_file_size, $image_quality=90){

//생성도중 에러가 날수 있는 것들을 체크 하여 return false
if (empty($src_file) || empty($dest_file) || !is_file($src_file) || !is_array($src_file_size) || !is_array($dest_file_size) || empty($src_file_size[0]) || empty($src_file_size[1]) || empty($src_file_size[2]) || empty($dest_file_size[0]) || empty($dest_file_size[0])) {

return false;
}

//$image_quality 확인후 조건에 맞지 않으면 기본값 세팅
if(!is_numeric($image_quality) || empty($image_quality)) $image_quality = 90;

//원본사이즈보다 썸네일 사이즈가 더 크면 원본사이즈와 같게 썸네일을 생성
if ($dest_file_size[0] > $src_file_size[0]) {

$dest_file_size = $src_file_size;
}

switch($src_file_size[2]) {

case 1: // GIF image
@exec( "gifsicle -I " . $src_file, $tempinfo);
$info = @join(" " , $tempinfo);

//gifsicle rpm이 설치되었을 경우 움직인는 gif도 썸네일 가능하다.
if (preg_match("'(loop forever|loop count)'", $info)) {

@exec( "gifsicle -O " . $image_quality . " --resize " . $dest_file_size[0] . "x" . $dest_file_size[1] . " " . $src_file . " > " . $dest_file );

//퍼미션 변경가능 여부를 가지고 썸네일 생성 실패 판단
return @chmod($dest_file, 0777);
}
else {

$src = @ImageCreateFromGIF($src_file);
}
break;

case 2: // JPEG image
$src = @ImageCreateFromJPEG($src_file); break;

case 3: // PNG image
$src = @ImageCreateFromPNG($src_file); break;

default: // 정해진 이외의 포맷은 return false
return false;
}

if (function_exists("imagecreatetruecolor")) {

// This function requires GD 2.0.1 or later.
$dst = @ImageCreateTrueColor($dest_file_size[0], $dest_file_size[1]);
}
else {

$dst = @ImageCreate($dest_file_size[0], $dest_file_size[1]);
}

// 1.00.05 gd 버전에 따라
if (function_exists("imagecopyresampled")) {

@imagecopyresampled($dst, $src, 0, 0, 0, 0, $dest_file_size[0], $dest_file_size[1], $src_file_size[0], $src_file_size[1]);
}
else {

// 1.00.02 imagecopyresized -> imagecopyresampled 로 교체
@imagecopyresized($dst, $src, 0, 0, 0, 0, $dest_file_size[0], $dest_file_size[1], $src_file_size[0], $src_file_size[1]);
}

@ImageJPEG($dst, $dest_file, $image_quality);
@ImageDestroy($src);
@ImageDestroy($dst);

//퍼미션 변경가능 여부를 가지고 썸네일 생성 실패 판단
return @chmod($dest_file, 0777);
}



//원격이미지 정보 가져오는 함수
function Ymake_sumnail_remoteimage($url, $save_dir, $referer=''){

global $dest_file;

$src_file = $save_dir . '/' . base64_encode($url);

$text = Yreadfile($url, $referer);
if (empty($text)) return Array();

$fp = @fopen ($src_file, "w");
@fwrite($fp, $text);//유일한 파일이므로 파일에 락을 걸지 않는다.
@fclose($fp);
@chmod ($src_file, 0777);

$src_file_size = @getimagesize($src_file);
$dest_file = $save_dir . '/s_' . base64_encode($url);
$dest_file_size = Array(200, 100);
$result = Ysumnail_rule($src_file, $dest_file, $src_file_size, $dest_file_size, 90, 'gd');

@unlink($src_file);

return $result;
}




//플록님 이미지
$url = "http://phosay.com/g4/data/file/demo_gallery/3660583642_49cb97ad_wo%2B091.jpg";//읽어올 url
$referer = "http://phosay.com/g4/";//속일 리퍼러, 넣지 않아도 됨
$save_dir = "./temp";
//임시저장디렉토리 지정, 상대경로
//퍼미션은 웹서버가 읽을 수 있도록, 일반적으로 777
//맨마지막에 / 를 붙이지 않는다.

$result = Ymake_sumnail_remoteimage($url, $save_dir, $referer);

echo "<br>원본이미지 <img src='" . $url . "' border=0>";

if (empty($result)) echo "<br>png 썸네일 생성에 실패하였습니다. 저장디렉토리의 퍼미션이나 원본의 이미지포맷, 또는 gd지원여부를 확인하세요.";
else echo "<br>png 썸네일이미지 <img src='" . $dest_file . "' border=0>";<div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:12:10 PHP & HTML에서 이동 됨]</div>
|

댓글 13개

생성되는 이미지의 이름이 전
편의상 base64_encode를 사용하여
인코딩 하였는데
사용하시는 분은 자신의 상황에 맞게 해당 내용을 수정하여 쓰시면 되겠습니다.
감사합니다.^^
얼른 데려가겠습니다.
멋진 자료를 선보여 주셔서 감사드립니다.
한 가지 더 추가되었으면 하는 기능이 있다면,
제 아무리 썸네일로 추출되는 자료라 할지라도,
해당 자료의 도메인을 추출해 워터마크로 가볍게 마무리가 되었으면
훨씬 더 좋을 것 같다는 생각을 해 봅니다.
네 그렇게 하면 더 좋겟네요
Yreadfile 펑션이 업다고 나오는데 기존의 Yfunction파일을 인크루드해서 테스트해보고있습니다.
한글파일명을 가진 이미지는 썸네일 생성이 안되나봅니다?
밤에 제대로 테스트해보고 코멘트 올리겠습니다.~~**
좋은 자료 감사합니다.....보쌈해 갑니다...^^
한글도 되게 해ㅤㄴㅘㅅ습니다.


원문이 수정이 안되네요

$text = Yreadfile($url, $referer);
이것 대신에


$read_url = iconv('utf-8', 'euc-kr', $url);//utf-8 사용자만 필요한 라인
$read_url = preg_replace("`( )`e", "rawurlencode('\\1')", $read_url);
$text = Yreadfile($read_url, $referer);
이렇게 고쳐 사용하세요.
거듭 감사드립니다^^
겟방식으로 불러들여 전체 혹은 레코드별로 생성하는데 까지 잘됩니다.
업데이트 스킨에 적용하는 삽질만 마치면 될듯합니다.
업데이트 스킨에서는 별도의 코딩없이 location.replace로 생성관련 파일을 부른후 다시 본문으로 보내는 방식으로도 잘 돌아가는군요.
리스트나 최신글에도 base64_encode 방식으로 변경해서 적용하니 더더욱 좋습니다.

제가 사용하는데는 문제가 없습니다만, port80을 막아놓은 경우에 대한 내용입니다.
Warning: fsockopen(): unable to connect to www.sir.co.kr:80 in /home/***/g4/skin/board/basic_link_thumb/Yfunction.php on line 115
원본 - http://www.sir.co.kr/img/t_post.gif
png 썸네일 생성에 실패하였습니다.~~

$url_port = Yvar_empty_check($array['port'], 80);
$fp = fsockopen($url_server, $url_port);//115 행

같은 스킨으로 두곳에서 테스트 해보는데 한곳에서만 위처럼 막히는 현상이 있고 다른 한곳은 정상적으로 생성이 되는군요.?!

큰 선물을 주셔서 고맙습니다.^^
잘보고 갑니다~
좋은 정보 감사합니다.
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
18년 전 조회 3,610
18년 전 조회 3,860
18년 전 조회 3,362
18년 전 조회 3,404
18년 전 조회 2,592
18년 전 조회 2,486
18년 전 조회 2,476
18년 전 조회 2,345
18년 전 조회 2,581
18년 전 조회 3,880
18년 전 조회 3,677
19년 전 조회 2,108
19년 전 조회 2,039
19년 전 조회 1,583
19년 전 조회 3,909
19년 전 조회 5,914
19년 전 조회 7,014
19년 전 조회 2,499
19년 전 조회 2,742
19년 전 조회 4,198
19년 전 조회 2,201
19년 전 조회 3,648
19년 전 조회 2,904
19년 전 조회 2,758
19년 전 조회 2,223
19년 전 조회 2,498
19년 전 조회 2,615
19년 전 조회 3,111
19년 전 조회 3,765
19년 전 조회 3,299
19년 전 조회 2,807
19년 전 조회 2,301
19년 전 조회 2,966
19년 전 조회 3,060
19년 전 조회 2,571
19년 전 조회 2,329
19년 전 조회 3,357
19년 전 조회 4,882
19년 전 조회 5,094
19년 전 조회 2,311
19년 전 조회 2,211
19년 전 조회 5,019
19년 전 조회 8,985
19년 전 조회 2,076
19년 전 조회 4,950
19년 전 조회 4,391
19년 전 조회 2,635
19년 전 조회 4,987
19년 전 조회 2,819
19년 전 조회 3,694
19년 전 조회 2,644
19년 전 조회 3,461
19년 전 조회 1,975
19년 전 조회 5,402
19년 전 조회 1,728
19년 전 조회 6,079
19년 전 조회 2,897
19년 전 조회 6,066
19년 전 조회 6,866
19년 전 조회 3,751
19년 전 조회 2,234
19년 전 조회 2,120
19년 전 조회 6,918
19년 전 조회 2,419
19년 전 조회 3,976
19년 전 조회 5,361
19년 전 조회 2,703
19년 전 조회 1,758
19년 전 조회 1,598
19년 전 조회 1,542
19년 전 조회 1,815
19년 전 조회 1,814
19년 전 조회 1,814
19년 전 조회 1,741
19년 전 조회 2,538
19년 전 조회 2,335
19년 전 조회 3,495
19년 전 조회 2,624
19년 전 조회 2,596
19년 전 조회 3,441
19년 전 조회 4,656
19년 전 조회 2,995
19년 전 조회 2,825
19년 전 조회 3,375
19년 전 조회 6,313
19년 전 조회 2,211
19년 전 조회 2,015
19년 전 조회 1,971
19년 전 조회 2,027
19년 전 조회 3,217
19년 전 조회 2,290
19년 전 조회 1,975
19년 전 조회 1,657
19년 전 조회 2,105
19년 전 조회 3,390
19년 전 조회 3,256
19년 전 조회 1,935
19년 전 조회 1,510
19년 전 조회 3,207
19년 전 조회 2,075