썸네일 만드는 함수(원격이미지포함, 리사이즈, 크롭, 워터마크) > 개발자팁

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

썸네일 만드는 함수(원격이미지포함, 리사이즈, 크롭, 워터마크) 정보

PHP 썸네일 만드는 함수(원격이미지포함, 리사이즈, 크롭, 워터마크)

첨부파일

image_proc.function.php (30.5K) 325회 다운로드 2012-02-26 11:45:35

본문

이전에 강좌로 하던 함수를 모닝님의 요청으로 조금 수정햇습니다.

원격이미지의 썸네일 만드는 기능도 포함하였습니다.

해당 라이브러리를 필요한 곳에 인클루드 하시고.

create_thumbnail('http://apmusers.com/tt/attach/1/1267047665.jpg', 'a.png', 50); 나

create_thumbnail('./attach/1/1267047665.jpg', 'a.png', 50); 등로 사용하면 됩니다.

자세한 옵션이나 설명은 라이브러리 파일내에 포함되어있습니다.
추천
12

댓글 30개

큰선물 감사드립니다.
바쁘신 중에도 저의 메일질문에 꼬박고박 답변해주셔서 얼마나 감사한 지 모르겠습니다.

하시는 일에 큰 성취가 있기를 빕니다.
에구... 이번버전은 돌아가기는 하지만,
확인하고싶은 것이 있습니다.


function extract_img($src) {
  $re = '/src[ =]+[\'"]([^\'"]+\.(?:gif|jpg|jpeg|png|bmp))[\'"]/i';
  preg_match_all($re, $src, &$match, PREG_PATTERN_ORDER);
  return $match[1];
}

    //본문에 링크한 이미지 레코드별 배열
    $dest_link[] = array( 'wr_id' => $list[$i]['wr_id'], 'url' => extract_img($list[$i]['wr_content']));
    //print_r2($dest_link[$i]);
    $url = $dest_link[$i]['url']['0'];//첫번째 링크된 이미지, 두번째는 $dest_link[$i]['url'][1]
-------------
위와 같은 방식으로 에딛그림(웹그림)을 불러왔는데,
이방식을 그대로 사용해야 하는가요?

아니면 여기 썸네일 소스에 준비된 다른 방식이 있는가요?
네 그렇게 사용하시면 됩니다.

이미지 url을 추출해서 쓰심 됩니다.
사용방법은 기존거와 같습니다.
단지 첫번째 변수가 url 도 쓸수 잇고 로컬 경로도 쓸수 잇다는 점만 다릅니다.
음......

경우에 따라 쓰기 나름이라서.........
공통적인 함수를 만들기는 애매합니다.

그냥 필요에 따라 모닝님 처럼 적당히 만들어서 사용해야 합니다.


예를 한가지 든다면.......
리스트에서 내용 사용으로 체크되어있는
리스트 스킨에서 사용한다고 가정하고

첨부 파일에 이미지가 있음 그것으로 대표 썸네일 이미지로 만들고
본문 내용중에 이미지 태그가 있으면 이미지 주소를 뽑아와서 그것으로
대표 썸네일 이미지를 만들겟다고 한다면.......



$save_w = 150;//저장될 썸네일 너비
$save_h = 0;//너비에 따라 높이 자동 조절

$options = Array();
$options['save_force'] = 1;
$options['crop_use'] = 0;

$path_save_dir = $g4['path'] . '/data/file/' . $bo_table . '/thumbnail;
if (!is_dir($path_save_dir)) {

    @mkdir($path_save_dir);
    @chmod($path_save_dir, 0777);
}

for ($i=0; $i<count($list); $i++) {

    $list[$i]['thumbnail'] = '';
    $path_save_file = $path_save_dir . '/list_' . $list[$i]['wr_id'] . '.png';

    if (!is_file($path_save_file)) {

        foreach($list[$i]['file'] as $k => $v) {

            if (preg_match("`\.(gif|jpe?g|png)$`i", $v[source])) {           
               
                if (create_thumbnail($v['file'], $path_save_file, $save_w, $save_h, $options)){

                    $list[$i]['thumbnail'] = $path_save_file;

                    break;
                }
            }
        }

        if (empty($list[$i]['thumbnail']) && !empty($list[$i]['wr_content']) && preg_match("`src\s*=([^>]+\.(gif|jpe?g|png))('|\"|\s|>)`iU", $list[$i]['wr_content'], $m)) {

            $m[1] = preg_replace("`[\s\"']+`", '', $m[1]);

            if (!empty($m[1])) {

                if (create_thumbnail($m[1], $path_save_file, $save_w, $save_h, $options)){

                    $list[$i]['thumbnail'] = $path_save_file;
                }
            }
        }
    }
    else {

        $list[$i]['thumbnail'] = $path_save_file;
    }



    ........

    if (!empty($list[$i]['thumbnail'])) echo "<img src='" . $list[$i]['thumbnail'] . "'>";

........



이런식으로 하면 되지 않을까 싶네요.

암튼 어떻게 사용하는가는 사용자의 몫인것 같습니다.
if (empty($list[$i]['thumbnail']) && !empty($list[$i]['wr_content']) && preg_match("`src\s*=([^>]+\.(gif|jpe?g|png))('|\"|\s|>)`iU", $list[$i]['wr_content'], $m)) {

        $m[1] = preg_replace("`[\s\"']+`", '', $m[1]);

        if (!empty($m[1])) {

            if (create_thumbnail($m[1], $path_save_file, $save_w, $save_h, $options)){

                $list[$i]['thumbnail'] = $path_save_file;
            }
        }
    }
---------------
이부분이 웹그림부분이지요?
아예 이것을 님의 자료 안에 집어넣을 수는 없는가요?

사용자 입장에서 이것도 신경안쓰고,
if ($m[1]) { create_thumbnail($m[1], $path_save_file, $save_w, $save_h, $options); }
만 하면 되게요...
위에서 말햇듯이
그런것은 포함하기 힘듭니다.
그때 그때 상황에 따라 다릅니다.

사용자가 맞춰서 써야겟지요.

그리고 이미지 주소를 이미 파싱한 경우에는 모닝님
처럼 쓰면 되죠
어렴풋한 제 기억으로는 아마 플록님이 하신 것으로 생각됩니다.

이것까지도 유창화님의 방식으로 소스 안에 포함되면 사용자의 입장에서 훨씬 간편하리라는 생각입니다.
죄송하지만 제일 보편적인 것으로 function 하나 넣어주세요...^^;
function create_thumbnail($path_src_file_or_url, $path_save_file, $save_w, $save_h=0, $options=Array())
요 앞에 넣어주시면 되잖아요,
순전히 사용자입장입니다ㅡ,.ㅡ
유창화님!!! 죄송합니다.
굳이 function을 도 만들지 않아도 될 것 같아요.
아래처럼 하니 나옵니다. 그리 복잡하지 않습니다.
정말 죄송했습니다.
그래도 더 단순하게 사용할 수 있으면 좋구요...^^;
--------------------------
    if (empty($list[$i]['thumb']) && !empty($list[$i]['wr_content']) && preg_match("`src\s*=([^>]+\.(gif|jpe?g|png))('|\"|\s|>)`iU", $list[$i]['wr_content'], $path_src_url)) {
   
        $path_src_url[1] = preg_replace("`[\s\"']+`", '', $path_src_url[1]);
       
        if (!empty($path_src_url[1])) {
           
                create_thumbnail($path_src_url[1], $path_save_file, $save_w, $save_h, $options);
세로기준의 중간 크롭방식이 필요해서 이 썸네일함수를 사용하고 싶은데
잘 않되네요.ㅠㅠ

사용법을 잘 모르겠습니다.

<?
include_once("./_common.php");
include_once("$g4[path]/lib/image_proc.function.php");
$file = "./imgp1602.jpg";

create_thumbnail('$file', 'a.jpg', 250, 250, 90,1, 2, 2);
create_thumbnail('./imgp1602.jpg', 'b.jpg', 50);
?>
<img src="a.jpg" />
<img src="b.jpg" />

위처럼 할때..
썸네일 파일이 생성 되지 않네요..흑
시하님.
일단 유창화님의 댓글대로 해보세요.

create_thumbnail($v['file'], $path_save_file, $save_w, $save_h, $options)
의 앞부분에 아래처럼 옵션이 나오고 썸네일이름과 저장위치가 먼저 정의되어야 합니다.
숫자로 쓰지 마시고...
원하시는 옵션(님?)을 무한정 넣어주기만 하면 됩니다.
--------------
$options = Array();
$options['save_force'] = 1;
$options['crop_use'] = 0;

$path_save_dir = $g4['path'] . '/data/file/' . $bo_table . '/thumbnail;
$path_save_file = $path_save_dir . '/list_' . $list[$i]['wr_id'] . '.png';
썸네일이 생성 안될때

echo $GLOBALS['errormsg']; 를 추가로 출력해보세요.
에러 내용을 알수 잇습니다.

create_thumbnail('$file', 'a.jpg', 250, 250, 90,1, 2, 2); 이거는 인자수가 안맞구요
create_thumbnail('./imgp1602.jpg', 'b.jpg', 50); 이거는
형식은 올바른데
같은 경로에 './imgp1602.jpg' 이파일 없거나
b.jpg 의 상위 디렉토리 권한이 777 이나 707 이 아닌것 같습니다.

그리고 크롭을 할려면

$options = Array();
$options['crop_use'] = 1; //크롭을 사용함
$options['crop_pos_width'] = 2;//너비 기준 크롭시 중앙을 기준
$options['crop_pos_height'] = 1;//높이 기준 크롭시 상단을 기준

등의 재정의 할 옵션을 설정하고
create_thumbnail('./imgp1602.jpg', 'b.jpg', 50, 50, $options);  와 같이 하거나

함수내에 옵션을 직접 변경하여

//기본값 설정
    $save_quality = 70;//저장 품질 : 70 %
    $save_force = 2;//저장형태 : 파일 덮어씌움

    $crop_use = 1;//크롭 사용여부
    $crop_pos_width = 2;//너비 기준 크롭시 중앙을 기준
    $crop_pos_height = 1;//높이 기준 크롭시 상단을 기준

    $watermark_path_file = '';//워터마크로 사용할 파일 경로 : 없음
    $watermark_pos = 4;//워터마크 찍는 위치 : 하단 오른쪽
    $watermark_sharpness = 30;//워터마크 이미지의 선명도 : 30 %
    $watermark_padding = 10;//원본과 워터마크 사이의 여백 : 10px

create_thumbnail('./imgp1602.jpg', 'b.jpg', 50, 50);

와 같이 사용하거나 하면 됩니다.
높이 값을 지정안하거나 0 으로 하면
자동으로 만들어질 너비에 맞게 정비율로 생성되고

높이 값을 지정하고 크롭을 사용안함으로 설정하면
강제로 너비와 높이를 맞춘 찌그러진 이미지가 생성되고

높이 값을 지정하고 크롭을 사용함으로 설정하면
크롭규칙대로
너비를 기준으로 왼쪽 가운데 오른쪽,
높일르 기준으로 상 중 하,
등으로 크롭한 이미지가 생성됩니다.
라이센스는 책이나 강좌에 포함되지만 않으면 됩니다.
즉 사용상에 제한은 없습니다.

http://sir.co.kr/bbs/board.php?bo_table=pg_php&wr_id=418&sca=&sfl=wr_name%2C1&stx=%EC%9C%A0%EC%B0%BD%ED%99%94&sop=and

이거의 최종본이라고 보심 됩니다.

관리자님의 지대한 관심 감사합니다!!!!
https 이미지를 읽어올려면
php에 openssl 익스텐션이 필요합니다.
만약 연동 되어잇다면
별다른 처리없이 https 이미지도 읽어올수 있습니다.
감사합니다 창화님^^
저도 작은 팁 하나 드립니다.

창화님의 썸네일 함수에 언샵마스크를 적용하는 팁하나 올립니다.

언샵마스크의 효과는 아래 링크에서 보실 수 있습니다.

샘플 페이지 : http://carisma.co.kr/v2/sub/thumb.php
언샵마스크는 썸네일 생성시에 이미지가 뭉개지면서 흐릿해지는데
이걸 깔끔하게 샤픈이미지로 만들어 줍니다.
위 샘플링크에서 볼 수 있듯이 400 픽셀의 이미지에선 잘 차이가 나지 않지만
200픽셀이미지에서는 차이가 나기 사작하며 100 픽셀에서는 확연한 차이가 납니다.

창화님의 썸네일 함수에 아래의 내용을 추가하면 됩니다.

1. 905번 째줄 function create_thumbnail(.....){ 의 위쪽에 아래의 내용을 추가해 주세요.

function UnsharpMask_100_1_2($img, $amount, $radius, $threshold)
{
  // $img is an image that is already created within php using 
  // imgcreatetruecolor. No url! $img must be a truecolor image. 

  // Attempt to calibrate the parameters to Photoshop: 
if ($amount > 500) $amount = 500;
$amount = $amount * 0.016;
if ($radius > 50) $radius = 50;
$radius = $radius * 2;
if ($threshold > 255) $threshold = 255;

$radius = abs(round($radius)); // Only integers make sense.
if ($radius == 0) { return $img; imagedestroy($img); break; }
$w = imagesx($img); $h = imagesy($img);
$imgCanvas = $img;
$imgCanvas2 = $img;
$imgBlur = imagecreatetruecolor($w, $h);

// Gaussian blur matrix:
// 1 2 1
// 2 4 2
// 1 2 1

// Move copies of the image around one pixel at the time and merge them with weight
// according to the matrix. The same matrix is simply repeated for higher radii.
for ($i = 0; $i < $radius; $i++)
{
imagecopy   ($imgBlur, $imgCanvas, 0, 0, 1, 1, $w - 1, $h - 1); // up left
imagecopymerge ($imgBlur, $imgCanvas, 1, 1, 0, 0, $w, $h, 50); // down right
imagecopymerge ($imgBlur, $imgCanvas, 0, 1, 1, 0, $w - 1, $h, 33.33333); // down left
imagecopymerge ($imgBlur, $imgCanvas, 1, 0, 0, 1, $w, $h - 1, 25); // up right
imagecopymerge ($imgBlur, $imgCanvas, 0, 0, 1, 0, $w - 1, $h, 33.33333); // left
imagecopymerge ($imgBlur, $imgCanvas, 1, 0, 0, 0, $w, $h, 25); // right
imagecopymerge ($imgBlur, $imgCanvas, 0, 0, 0, 1, $w, $h - 1, 20 ); // up
imagecopymerge ($imgBlur, $imgCanvas, 0, 1, 0, 0, $w, $h, 16.666667); // down
imagecopymerge ($imgBlur, $imgCanvas, 0, 0, 0, 0, $w, $h, 50); // center
}
$imgCanvas = $imgBlur;

// Calculate the difference between the blurred pixels and the original
// and set the pixels
for ($x = 0; $x < $w; $x++)
{ // each row
for ($y = 0; $y < $h; $y++)
{ // each pixel
$rgbOrig = ImageColorAt($imgCanvas2, $x, $y);
$rOrig = (($rgbOrig >> 16) & 0xFF);
$gOrig = (($rgbOrig >> 8) & 0xFF);
$bOrig = ($rgbOrig & 0xFF);
$rgbBlur = ImageColorAt($imgCanvas, $x, $y);
$rBlur = (($rgbBlur >> 16) & 0xFF);
$gBlur = (($rgbBlur >> 8) & 0xFF);
$bBlur = ($rgbBlur & 0xFF);

// When the masked pixels differ less from the original
// than the threshold specifies, they are set to their original value.
$rNew = (abs($rOrig - $rBlur) >= $threshold) ? max(0, min(255, ($amount * ($rOrig - $rBlur)) + $rOrig)) : $rOrig;
$gNew = (abs($gOrig - $gBlur) >= $threshold) ? max(0, min(255, ($amount * ($gOrig - $gBlur)) + $gOrig)) : $gOrig;
$bNew = (abs($bOrig - $bBlur) >= $threshold) ? max(0, min(255, ($amount * ($bOrig - $bBlur)) + $bOrig)) : $bOrig;

if (($rOrig != $rNew) || ($gOrig != $gNew) || ($bOrig != $bNew))
{
$pixCol = ImageColorAllocate($img, $rNew, $gNew, $bNew);
ImageSetPixel($img, $x, $y, $pixCol);
}
}
}
return $img;
}

2. 918번째 줄 $watermark_padding = 10;//원본과 워터마크 사이의 여백 : 10px 밑으로 아래 내용추가

$filter[arg1] = 100;
$filter[arg2] = 1;
$filter[arg3] = 2;

3. 978번째줄 $result_save = save_image_from_resource (...); 바로 위에 아래 한줄 추가

UnsharpMask_100_1_2($dst, $filter[arg1], $filter[arg2], $filter[arg3]);

위처럼 적용하시면 창화님의 썸네일 함수에서 언샵 마스크를 적용하여 사용할 수 있습니다.

ps.쓸모없다고 말하진 말아주세요 ^^;;
전체 64
개발자팁 내용 검색

회원로그인

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