종합 썸네일 함수 만들기

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

강좌는 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개

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

프로그램

+
제목 글쓴이 날짜 조회
13년 전 조회 614
13년 전 조회 2,131
13년 전 조회 1,862
13년 전 조회 652
13년 전 조회 1,215
13년 전 조회 633
13년 전 조회 924
13년 전 조회 1,208
13년 전 조회 3,596
13년 전 조회 2,134
13년 전 조회 2,315
13년 전 조회 3,689
13년 전 조회 3,497
13년 전 조회 3,155
13년 전 조회 4,026
13년 전 조회 1,037
13년 전 조회 6,001
13년 전 조회 1,387
13년 전 조회 1,234
13년 전 조회 3,421
13년 전 조회 3,053
13년 전 조회 5,204
13년 전 조회 2,712
13년 전 조회 3,349
13년 전 조회 1,037
13년 전 조회 870
13년 전 조회 2,038
13년 전 조회 830
13년 전 조회 2,232
13년 전 조회 1,533
13년 전 조회 1,132
13년 전 조회 2,119
13년 전 조회 2,334
13년 전 조회 1,331
13년 전 조회 808
13년 전 조회 1,357
13년 전 조회 846
13년 전 조회 1,234
13년 전 조회 3,871
13년 전 조회 3,968
13년 전 조회 1,386
13년 전 조회 6,978
13년 전 조회 7,567
13년 전 조회 2,327
13년 전 조회 3,878
13년 전 조회 653
13년 전 조회 3,682
13년 전 조회 3,500
13년 전 조회 2,739
13년 전 조회 2,841
13년 전 조회 2,375
13년 전 조회 2,272
13년 전 조회 5,190
13년 전 조회 2,828
13년 전 조회 3,147
13년 전 조회 2,274
13년 전 조회 6,844
13년 전 조회 2,579
13년 전 조회 3,442
13년 전 조회 2,335
13년 전 조회 4,834
13년 전 조회 3,699
13년 전 조회 2,563
13년 전 조회 2,249
13년 전 조회 1,301
13년 전 조회 3,446
13년 전 조회 4,106
13년 전 조회 3,466
13년 전 조회 5,348
13년 전 조회 1,670
13년 전 조회 1,291
13년 전 조회 5,188
13년 전 조회 957
13년 전 조회 3,422
13년 전 조회 3,428
13년 전 조회 3,010
13년 전 조회 3,365
13년 전 조회 2,886
13년 전 조회 2,859
13년 전 조회 2,887
13년 전 조회 2,882
13년 전 조회 2,903
13년 전 조회 2,851
13년 전 조회 2,875
13년 전 조회 1,504
13년 전 조회 917
13년 전 조회 828
13년 전 조회 611
13년 전 조회 2,835
13년 전 조회 2,977
13년 전 조회 2,123
13년 전 조회 1,351
13년 전 조회 804
13년 전 조회 2,890
13년 전 조회 3,218
13년 전 조회 1,260
13년 전 조회 1.1만
13년 전 조회 1,439
13년 전 조회 452
13년 전 조회 1,394
🐛 버그신고