외부의 이미지를 자신의 서버경로에 썸네일 만드는 방법 > 퍼블리셔팁

퍼블리셔팁

퍼블리싱과 관련된 유용한 정보를 공유하세요.
질문은 상단의 QA에서 해주시기 바랍니다.

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

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

본문

안녕하세요

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

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

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

예제 : 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>
추천
0

댓글 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 행

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

큰 선물을 주셔서 고맙습니다.^^
전체 1,264
퍼블리셔팁 내용 검색

회원로그인

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