종합 썸네일 함수 만들기

대단할것은 없는 강좌이지만,
제 강좌를 출처를 밝히고 외부로 퍼가는 것은 허용하지만,
다른 강좌의 자료나 책의 자료로 사용되거나 부분적인 인용은 허용하지 않습니다.

강좌는 php 5. 대를 기준으로 하며, 기본적으로 GD 나 FREETYPE 등의 기본적인 라이브러리는 연동되었다는 가정하에 진행합니다.
예전 개발 환경에서는 GD 나 FREETYPE 등의 연동여부나 php버젼들을 따졌지만, 요새 개발 환경에서는 대부분 기본적으로 다 제공하기 때문에 그렇습니다.

종합 썸네일 함수 만들기
  
  이전까지는 이미지의 리사이즈, 크롭, 워터마크에 대해 다루었습니다.
이번에는 이전에 다뤗던 내용을 모두 포함하는 종합적인 썸네일 함수를 만들어 보겠습니다.

물론, 이번에 만드는 것이 최종 완성판은 아니며, 나중에 내용을 더 진행하면 수정 보완됩니다.

함수를 만들기 이전에 이함수가 어떤 처리를 하는지 대략적인 정리를 해보고자 합니다.

처리과정>
1. 처리에 필요한 기본값을 정의합니다.
2. 원본 파일로 부터 이미지 리소스를 생성합니다.
3. 크롭사용 여부에 따라 크롭이나 리사이즈 처리를 한 썸네일의 리소스를 생성합니다.
4. 워터마크 이미지가 존재한다면 워터마크를 조건에 따라 처리합니다.
5. 지정된 경로로 썸네일을 저장합니다.

위의 처리과정대로 함수를 만들기 위해서는 많은 인자를 필요로 합니다.
하지만, 항상 필요한 인자들은 아닙니다. 경우에 따라 필요할수도 있고 없을수도 있습니다.
그래서 함수의 인자는 최대한 간략한 형태로 하고, $options 배열 인자를 두어 사용에 필요한 인자는 배열을 통해서 받도록 처리하였습니다.

예제1 : thumnail_test1 을 image_proc.function.php 에 추가

function thumnail_test1($path_src_file, $path_save_file, $save_w, $save_h=0, $options=Array()){

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

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

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

  //기본값 재설정
  if (!empty($options)) @extract($options);

  //원본 리소스 생성
  list($src, $src_w, $src_h) = get_image_resource_from_file ($path_src_file);
  if (empty($src)) return false;

  //리사이즈 또는 크롭 리사이즈
  if ($crop_use == 1) {//크롭 리사이즈

    $dst = get_image_cropresize($src, $src_w, $src_h, $save_w, $save_h, $crop_pos_width, $crop_pos_height);
  }
  else {//리사이즈

    $dst = get_image_resize($src, $src_w, $src_h, $save_w, $save_h);
  }

  @imagedestroy($src);
  if (empty($dst)) return false;

  //워터마크 이미지가 파일일 경우, 워터마크 처리
  if (!empty($watermark_path_file) && is_file($watermark_path_file)) {

    $result_watermark = proc_watermark($dst, $save_w, $save_h, $watermark_path_file, $watermark_pos, $watermark_sharpness, $watermark_padding);

    if (empty($result_watermark)) return false;
  }

  $result_save = save_image_from_resource ($dst, $path_save_file, $save_quality, $save_force);

  @imagedestroy($dst);

  return $result_save;
}

함수 내용을 보면 처리해야 할 내용에 비해 아주 간단합니다. 이유는 이미 세부적인 처리를 하는 부분은 함수로 다 만들어 두었기 때문에 이 함수 내에서는 그 함수들을 사용만 하면 되기 때문입니다.

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

이것은 저장과 관련된 기본값입니다.

$save_quality 는 저장 품질을 결정 짓는 변수입니다. 이전에 만든 save_image_from_resource 함수의 $quality 변수와 동일합니다. 기본값은 70 으로 주었습니다.

$save_force 는 동일 경로상에 동일한 이름의 파일이 존재할 경우에 대처방향을 변수로 저장하는 것입니다. 물론 이것역시 save_image_from_resource 함수의 $save_force 변수와 동일합니다. 0일 경우 return false, 1일 경우 return true, 2일 경우 기존 파일을 삭제하고 새로 저장을 합니다. 기본값은 2 파일 덮어씌움으로 주었습니다.

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

이것은 크롭과 관련된 기본값입니다.
$crop_use 는 크롭을 사용할지를 결정짓는 변수입니다. 0 일 경우에는 사용하지 않고, 1일 경우에는 사용합니다. 기본값은 0으로 주었습니다.

$crop_pos_width 는 너비 기준으로 크롭을 하게 되었을때 너비중 어디를 기준으로 크롭을 할것인가를 결정짓는 변수입니다. 1일 경우에는 왼쪽, 2일 경우에는 중앙, 3일 경우에는 오른쪽을 기준으로 크롭을 실행합니다.

$crop_pos_height 는 높이 기준으로 크롭을 하게 되었을때 높이중 어디를 기준으로 크롭을 할것인가를 결정짓는 변수입니다. 1일 경우에는 상단, 2일 경우에는 중단, 3일 경우에는 하단을 기준으로 크롭을 실행합니다.

여기에 설정된 $crop_pos_width 과 $crop_pos_height 는 get_image_cropresize 함수의 $pos_width, $pos_height 와 동일합니다.

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

이것은 워터마크와 관련된 기본값입니다.
모두 proc_watermark 함수의 $path_mark_file, $pos, $sharpness, $padding 과 동일합니다.
가장 최근에 다른 내용이므로 별도의 설명은 하지 않겠습니다.

워터마크처리 의 경우는 $watermark_path_file 로 설정된 값이 존재하는 파일 일 경우에만 실행됩니다.
기본값이 빈값이기 때문에 워터마크처리를 하기위해선 $options['watermark_path_file'] = '워터마크 파일의 경로'; 와 같이 설정하고 넘겨 주어야 합니다.

나머지 기본값들의 변경 역시 $options['변수명'] = '값'; 을 통하여 기본값을 변경할수가 있습니다.

사실, 이러한 부분은 클래스로 만들어서 하면 좀 더 깔끔하고 사용하기도 나아보입니다. 하지만, 강좌의 난이도도 있고 또 php4와 php5 의 클래스 문법차이가 심하기 때문에 더 혼란을 가져올수도 있는 부분이 있습니다. 나중에 클래스 강좌를 하게 된다면 썸네일 클래스를 다뤄보도록 하겠습니다.


아래의 예제를 확인하여 이 썸네일 함수의 사용법을 익혀보도록 합니다.

예제2 : test16.php

<?php

//이미지 처리 함수 인클루드
include_once 'lib/image_proc.function.php';



$path_src_file = 'sample_image/test.jpg';//원본파일
$path_mark_file ='sample_image/php.png';//워터마크에 사용할 파일
$path_400X0_file = 'sample_image/test_400X0.jpg';//원본파일을 너비 400으로 정비율 리사이즈



//원본을 너비 400 정비율 리사이즈, $path_400X0_file 에 기본 저장 옵션
$save_w = 400;

$result = thumnail_test1($path_src_file, $path_400X0_file, $save_w);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w 으로 정비율 리사이즈 <br />
<img src='$path_400X0_file'> <br /><br />
";
flush();



//$path_400X0_file을 높이 200 정비율 리사이즈, 저장시 quality 10%로 저장
$save_w = 0;
$save_h = 200;

$options = Array();//옵션설정
$options['save_quality'] = 10;

$path_save_file = 'sample_image/test_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
높이 $save_h 으로 정비율 리사이즈, 저장시 quality 10% <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 300 강제 리사이즈, 기본 저장 옵션
$save_w = 300;
$save_h = 300;

$path_save_file = 'sample_image/test_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이 $save_h 강제 리사이즈 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 100 크롭 리사이즈, 기본 저장 옵션
$save_w = 300;
$save_h = 100;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함
$options['crop_pos_height'] = 1;

$path_save_file = 'sample_image/test_crop_top_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 상단 크롭 리사이즈 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 100 크롭 리사이즈, 기본 저장 옵션
$save_w = 300;
$save_h = 100;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함
$options['crop_pos_height'] = 2;

$path_save_file = 'sample_image/test_crop_middle_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 중단 크롭 리사이즈 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 100 크롭 리사이즈, 기본 저장 옵션
$save_w = 300;
$save_h = 100;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함
$options['crop_pos_height'] = 3;

$path_save_file = 'sample_image/test_crop_bottom_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 하단 크롭 리사이즈 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 200, 높이 300 크롭 리사이즈, 기본 저장 옵션
$save_w = 200;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함
$options['crop_pos_width'] = 1;

$path_save_file = 'sample_image/test_crop_left_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 왼쪽 크롭 리사이즈 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 200, 높이 300 크롭 리사이즈, 기본 저장 옵션
$save_w = 200;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함
$options['crop_pos_width'] = 2;

$path_save_file = 'sample_image/test_crop_center_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 중앙 크롭 리사이즈 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 200, 높이 300 크롭 리사이즈, 기본 저장 옵션
$save_w = 200;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함
$options['crop_pos_width'] = 3;

$path_save_file = 'sample_image/test_crop_right_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 오른쪽 크롭 리사이즈 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 300 크롭 리사이즈, 워터마크 사용, 기본 저장 옵션
$save_w = 300;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함

$options['watermark_path_file'] = $path_mark_file;//워터마크 이미지
$options['watermark_pos'] = 1;

$path_save_file = 'sample_image/test_mark_top_left_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 크롭 리사이즈, 상단 왼쪽 워터마크 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 300 크롭 리사이즈, 워터마크 사용, 기본 저장 옵션
$save_w = 300;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함

$options['watermark_path_file'] = $path_mark_file;//워터마크 이미지
$options['watermark_pos'] = 2;

$path_save_file = 'sample_image/test_mark_top_right_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 크롭 리사이즈, 상단 오른쪽 워터마크 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 300 크롭 리사이즈, 워터마크 사용, 기본 저장 옵션
$save_w = 300;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함

$options['watermark_path_file'] = $path_mark_file;//워터마크 이미지
$options['watermark_pos'] = 3;

$path_save_file = 'sample_image/test_mark_bottom_left_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 크롭 리사이즈, 하단 왼쪽 워터마크 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 300 크롭 리사이즈, 워터마크 사용, 기본 저장 옵션
$save_w = 300;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함

$options['watermark_path_file'] = $path_mark_file;//워터마크 이미지
$options['watermark_pos'] = 4;

$path_save_file = 'sample_image/test_mark_bottom_right_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 크롭 리사이즈, 하단 오른쪽 워터마크 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 300 크롭 리사이즈, 워터마크 사용, 기본 저장 옵션
$save_w = 300;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함

$options['watermark_path_file'] = $path_mark_file;//워터마크 이미지
$options['watermark_pos'] = 5;

$path_save_file = 'sample_image/test_mark_middle_center_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 크롭 리사이즈, 중앙 워터마크 <br />
<img src='$path_save_file'> <br /><br />
";
flush();



//$path_400X0_file을 너비 300, 높이 300 크롭 리사이즈, 워터마크 사용, 기본 저장 옵션
$save_w = 300;
$save_h = 300;

$options = Array();//기본옵션
$options['crop_use'] = 1;//크롭 사용함

$options['watermark_path_file'] = $path_mark_file;//워터마크 이미지
$options['watermark_pos'] = 10;

$path_save_file = 'sample_image/test_mark_all_' . $save_w . 'X' . $save_h . '.jpg';

$result = thumnail_test1($path_400X0_file, $path_save_file, $save_w, $save_h, $options);
if (empty($result)) die($GLOBALS['errormsg'] . "<br />\n");

echo "
너비 $save_w, 높이$save_h 크롭 리사이즈, 전체 워터마크 <br />
<img src='$path_save_file'> <br /><br />
";
flush();

?>

  
  
 

첨부파일

image_proc.function.php (23 KB) 70회 2013-01-14 16:14
|

댓글 1개

댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

+
제목 글쓴이 날짜 조회
12년 전 조회 598
12년 전 조회 2,117
12년 전 조회 1,845
12년 전 조회 636
12년 전 조회 1,198
12년 전 조회 620
12년 전 조회 908
12년 전 조회 1,192
13년 전 조회 3,577
13년 전 조회 2,113
13년 전 조회 2,302
13년 전 조회 3,674
13년 전 조회 3,479
13년 전 조회 3,138
13년 전 조회 4,006
13년 전 조회 1,019
13년 전 조회 5,985
13년 전 조회 1,372
13년 전 조회 1,221
13년 전 조회 3,403
13년 전 조회 3,036
13년 전 조회 5,187
13년 전 조회 2,694
13년 전 조회 3,331
13년 전 조회 1,022
13년 전 조회 855
13년 전 조회 2,020
13년 전 조회 815
13년 전 조회 2,217
13년 전 조회 1,514
13년 전 조회 1,115
13년 전 조회 2,103
13년 전 조회 2,316
13년 전 조회 1,319
13년 전 조회 791
13년 전 조회 1,339
13년 전 조회 830
13년 전 조회 1,215
13년 전 조회 3,854
13년 전 조회 3,952
13년 전 조회 1,373
13년 전 조회 6,972
13년 전 조회 7,557
13년 전 조회 2,311
13년 전 조회 3,864
13년 전 조회 639
13년 전 조회 3,663
13년 전 조회 3,485
13년 전 조회 2,720
13년 전 조회 2,824
13년 전 조회 2,361
13년 전 조회 2,269
13년 전 조회 5,174
13년 전 조회 2,810
13년 전 조회 3,131
13년 전 조회 2,254
13년 전 조회 6,828
13년 전 조회 2,563
13년 전 조회 3,424
13년 전 조회 2,317
13년 전 조회 4,816
13년 전 조회 3,682
13년 전 조회 2,548
13년 전 조회 2,230
13년 전 조회 1,287
13년 전 조회 3,431
13년 전 조회 4,091
13년 전 조회 3,455
13년 전 조회 5,334
13년 전 조회 1,655
13년 전 조회 1,273
13년 전 조회 5,170
13년 전 조회 942
13년 전 조회 3,409
13년 전 조회 3,414
13년 전 조회 2,998
13년 전 조회 3,351
13년 전 조회 2,871
13년 전 조회 2,847
13년 전 조회 2,871
13년 전 조회 2,866
13년 전 조회 2,886
13년 전 조회 2,834
13년 전 조회 2,863
13년 전 조회 1,488
13년 전 조회 902
13년 전 조회 812
13년 전 조회 597
13년 전 조회 2,822
13년 전 조회 2,962
13년 전 조회 2,110
13년 전 조회 1,341
13년 전 조회 791
13년 전 조회 2,876
13년 전 조회 3,202
13년 전 조회 1,244
13년 전 조회 1.1만
13년 전 조회 1,429
13년 전 조회 435
13년 전 조회 1,378
🐛 버그신고