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

안녕하세요

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

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

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

예제 : 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,608
18년 전 조회 3,857
18년 전 조회 3,359
18년 전 조회 3,402
18년 전 조회 2,592
18년 전 조회 2,486
18년 전 조회 2,476
18년 전 조회 2,344
18년 전 조회 2,579
18년 전 조회 3,879
18년 전 조회 3,676
19년 전 조회 2,108
19년 전 조회 2,037
19년 전 조회 1,582
19년 전 조회 3,907
19년 전 조회 5,912
19년 전 조회 7,011
19년 전 조회 2,497
19년 전 조회 2,738
19년 전 조회 4,196
19년 전 조회 2,201
19년 전 조회 3,645
19년 전 조회 2,903
19년 전 조회 2,758
19년 전 조회 2,221
19년 전 조회 2,494
19년 전 조회 2,614
19년 전 조회 3,111
19년 전 조회 3,765
19년 전 조회 3,297
19년 전 조회 2,804
19년 전 조회 2,301
19년 전 조회 2,965
19년 전 조회 3,060
19년 전 조회 2,569
19년 전 조회 2,328
19년 전 조회 3,357
19년 전 조회 4,880
19년 전 조회 5,092
19년 전 조회 2,311
19년 전 조회 2,208
19년 전 조회 5,019
19년 전 조회 8,983
19년 전 조회 2,073
19년 전 조회 4,949
19년 전 조회 4,390
19년 전 조회 2,635
19년 전 조회 4,987
19년 전 조회 2,817
19년 전 조회 3,691
19년 전 조회 2,644
19년 전 조회 3,459
19년 전 조회 1,973
19년 전 조회 5,400
19년 전 조회 1,728
19년 전 조회 6,077
19년 전 조회 2,897
19년 전 조회 6,065
19년 전 조회 6,864
19년 전 조회 3,750
19년 전 조회 2,232
19년 전 조회 2,119
19년 전 조회 6,918
19년 전 조회 2,416
19년 전 조회 3,975
19년 전 조회 5,360
19년 전 조회 2,701
19년 전 조회 1,758
19년 전 조회 1,598
19년 전 조회 1,541
19년 전 조회 1,815
19년 전 조회 1,813
19년 전 조회 1,810
19년 전 조회 1,738
19년 전 조회 2,537
19년 전 조회 2,335
19년 전 조회 3,494
19년 전 조회 2,623
19년 전 조회 2,594
19년 전 조회 3,440
19년 전 조회 4,654
19년 전 조회 2,995
19년 전 조회 2,824
19년 전 조회 3,373
19년 전 조회 6,311
19년 전 조회 2,209
19년 전 조회 2,014
19년 전 조회 1,968
19년 전 조회 2,025
19년 전 조회 3,216
19년 전 조회 2,288
19년 전 조회 1,975
19년 전 조회 1,656
19년 전 조회 2,102
19년 전 조회 3,390
19년 전 조회 3,251
19년 전 조회 1,933
19년 전 조회 1,508
19년 전 조회 3,206
19년 전 조회 2,074