외부의 이미지를 자신의 서버경로에 썸네일 만드는 방법 :: PHP팁 게시판[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

PHP팁 게시판
[1]
등록일:2008-04-07 01:14:10 (0%)
작성자:
제목:외부의 이미지를 자신의 서버경로에 썸네일 만드는 방법
안녕하세요

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

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

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

예제 : 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>";
http://www.sir.co.kr/bbs/board.php?bo_table=pl_php&wr_id=470 (145)

출처 : http://www.sc8000.net/gn/bbs/board.php?bo_table=design_tip&wr_id=585&page=16
[본문링크] 외부의 이미지를 자신의 서버경로에 썸네일 만드는 방법
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=7273
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.