이미지 처리에 필요한 기본함수 만들기 > 개발강좌

개발강좌

프로그램 강좌 :
1. 유창화님의 썸네일, 정규표현식, 이미지관련 강좌
2. Sphinx 검색엔진을 이용한 도로명 주소 검색 시스템 구축

이미지 처리에 필요한 기본함수 만들기 정보

썸네일 이미지 처리에 필요한 기본함수 만들기

본문

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

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

이미지 처리에 필요한 기본함수 만들기 입니다.

이전에는 단순이미지 복사에 대해 예제를 통해 알아보았습니다.
이번에는 이전 내용을 가지고 반복 사용되는 부분을 함수로 만들어 보도록 하겠습니다.

함수란 여러가지 정의가 있지만 제나름데로 간단하게 정의 하자면, 반복되는 공통된 처리에 대한 부분을 하나의 도구로서 정의하는 것입니다. 즉, `재사용 한다` 에 핵심이 있습니다.

사물의 예로 들면,
나사를 풀고 조이는 역활을 하는 드라이버가 프로그램에서는 함수라고 볼수 있습니다.
만약, 드라이버가 없다면 나사를 풀고 조이기 위해서는 드라이버와 같은 도구를 만들기 위한 고민과 시행착오를 무수히 거치게 될것입니다.

이런 힘든 과정을 매번 반복하지 않기 위해 탄생한것이 드라이버라고 한다면, 드라이버는 도구, 즉 함수가 되는 것입니다.

나사를 풀거나 조일때는 드라이버를 사용하듯이,
이미지를 만들거나 처리하는 부분에 대해서 관련함수를 정의해 놓으면, 다음 부터는 복잡한 과정을 생략하고 그 함수를 사용하기만 하면 되는 것입니다.

물론 제가 내린 정의가 정확한 함수의 정의라고 볼수 없습니다.
하지만, 이해하는데는 많은 도움이 되리라 생각합니다.
위의 정의에 해당하는 것이 꼭 함수만 있는 것은 아니고, 클래스와 같은 것이 있지만 이것 역시 현재는 쉽게 함수의 확장 정도로만 이해하면 좋을 듯 합니다.

함수를 만들기 이전에 먼저, image_test 폴더에 lib 라는 폴더를 생성합니다.
앞으로 예제로 사용되는 함수는 이곳에 만들것이며, 그렇게 함으로서 일반 파일과 함수 파일의 구분을 용이하게 할수 있습니다.

어떤 특정이미지를 복사하거나 리사이즈 하기 위해서는 항상 공통적으로 사용되는 부분이 그 특정이미지로 부터 이미지 리소스를 받아오는 것과 최종적으로 파일로 저장하는 것입니다.
항상 반복되는 부분이므로, 이부분에 대해 함수를 한번 만들어 볼까 합니다.

예제1 : lib/image_proc.function.php

<?php

//특정 이미지파일(gif, jpg, png 만 지원)의 경로로 부터 이미지 리소스를 받아온다. 리턴값은 성공시에는 이미지리소스를 반환, 실패시에는 false 를 반환
function get_image_resource_from_file ($path_file){  

  if (!is_file($path_file)) {//파일이 아니라면

    $GLOBALS['errormsg'] = $path_file . '은 파일이 아닙니다.';
    return false;
  }

  $size = @getimagesize($path_file);
  if (empty($size[2])) {//이미지 타입이 없다면

    $GLOBALS['errormsg'] = $path_file . '은 이미지 파일이 아닙니다.';
    return false;
  }

  if ($size[2] != 1 && $size[2] != 2 && $size[2] != 3) {//지원하는 이미지 타입이 아니라면

    $GLOBALS['errormsg'] = $path_file . '은 gif 나 jpg, png 파일이 아닙니다.';
    return false;
  }

  switch($size[2]){

    case 1 : //gif
      $im = @imagecreatefromgif($path_file);
      break;

    case 2 : //jpg
      $im = @imagecreatefromjpeg($path_file);
      break;

    case 3 : //png
      $im = @imagecreatefrompng($path_file);
      break;
  }

  if ($im === false) {//이미지 리소스를 가져오기에 실패하였다면

    $GLOBALS['errormsg'] = $path_file . ' 에서 이미지 리소스를 가져오는 것에 실패하였습니다.';
    return false;
  }
  else {//이미지 리소스를 가져오기에 성공하였다면

    return $im;
  }
}


//인수로 받아온 이미지 리소스와 파일 저장 경로를 가지고 이미지를 저장한다. 성공시 true, 실패시 false 반환
function save_image_from_resource ($im, $path_save_file){

  $path_save_dir = dirname($path_save_file);
  if (!is_dir($path_save_dir)) {

    $GLOBALS['errormsg'] = $path_save_dir . '은 디렉토리가 아닙니다.';
    return false;
  }

  if (!is_writable($path_save_dir)){

    $GLOBALS['errormsg'] = $path_save_dir . '에 이미지를 저장할 권한이 없습니다.';
    return false;
  }

  if (is_file($path_save_file) || is_dir($path_save_file)) {

    $GLOBALS['errormsg'] = $path_save_file . '은 이미 존재하는 파일이거나 디렉토리입니다.';
    return false;
  }

  $extension = strtolower(substr($path_save_file, strrpos($path_save_file, '.') + 1));

  switch($extension){

    case 'gif' :
      $result_save = @imagegif($im, $path_save_file);
      break;

    case 'jpg' :
    case 'jpeg' :
      $result_save = @imagejpeg($im, $path_save_file);
      break;

    default : //확장자 png 또는 확장자가 없는 경우, 정의되지 않는 확장자인 경우는 모두 png로 저장
      $result_save = @imagepng($im, $path_save_file);
  }

  if ($result_save === false) {//이미지 저장에 실패

    $GLOBALS['errormsg'] = $path_save_file . '의 저장에 실패하였습니다.';
    return false;
  }
  else {//이미지 저장에 성공

    return true;
  }
}

?>

get_image_resource_from_file ($path_file)
이 함수는 원본 파일 경로로 부터 이미지 리소스를 받아오는 함수입니다.
받는 인자는 원본파일의 경로입니다.

이 함수의 실행순서는 아래와 같습니다.
1. 원본파일이 파일인지 여부 체크
2. 원본파일이 이미지파일인지 여부 체크
3. 원본파일이 이 프로그램에서 지원하는 이미지 타입인지 체크
4. 원본파일로 부터 이미지 리소스 받아옴
5. 이미지 리소스가 제대로 받아왓는지 체크 후 성공은 이미지리소스를 반환, 실패는 false 를 반환

이 함수가 실행시 에러 발생시 반환값 false 를 돌려주기 이전에
$GLOBALS['errormsg'] = $path_file . '은 파일이 아닙니다.';
와 같이 에러메시지를 $GLOBALS['errormsg'] 변수에 담는 것이 보일것입니다.

이렇게 하는 이유는
함수 실행 결과에서는 단순한 리턴값만 있기 때문에 어떤 에러가 났는지 정확하게 모르게 됩니다.
그렇기 때문에 $GLOBALS 라는 슈퍼 전역 변수에 에러메시지를 저장하여 실패시 언제든지 에러내용을 확인하기 위해서 그렇게 한것입니다.

※ php에서는 미리 정의된 변수들이 많이 있습니다. 그중에서도 슈퍼전역변수라는 것이 있습니다.
여기에 속한 변수는 항상 php가 실행되는 동안에는 언제 어디서든 값을 볼수 있습니다.
이런 내용은 기초 강좌에서 이미 보았으리라고 보고 참고 메뉴얼 링크를 걸어둡니다.
http://kr2.php.net/manual/kr/language.variables.superglobals.php


save_image_from_resource ($im, $path_save_file)
이 함수는 각종 처리가 된 이미지 리소스를 가지고 이미지파일로 저장하는 함수입니다.
받는 인자는 이미지 리소스 와 파일 저장 경로 입니다.

이 함수의 실행순서는 아래와 같습니다.
1. 파일 저장경로에서 파일이름을 제외한 상위 디렉토리 경로가 실제 존재하는 디렉토리인지 체크
2. 그 디렉토리가 이 프로그램에서 파일을 저장할수 있는 권한이 있는지 체크
3. 저장파일경로와 동일한 경로의 디렉토리나 파일이 있는지 체크
4. 이미지 리소스를 가지고 확장자에 해당하는 이미지로 저장
5. 이미지가 제대로 저장되었는지 체크 후 성공은 true 를 반환, 실패는 false 를 반환

drname
이 함수는 php에 내장된 함수로서 파일이나 디렉토리의 경로를 인자로 받아서 바로 상위의 디렉토리 경로를 반환합니다.

is_writable
이 함수는 php에 내장된 함수로서 파일이나 디렉토리의 경로를 인자로 받아서 현재의 프로그램상에서 해당 디렉토리에 파일을 생성하거나 해당 파일을 수정삭제 권한이 있는지 여부를 확인하여 줍니다.
사용가능할경우에는 true 그렇지 않을 경우에는 false 를 반환합니다.

strtolower
이 함수는 php에 내장된 함수로서 인자로 받은 문자열을 모두 소문자로 변경하여 반환하는 역활을 합니다.
strtoupper 는 반대의 역활을 하는 함수입니다.

strrpos
이 함수는 php에 내장된 함수로서 첫번째 인자로 받은 문자열을 두번째 받은 하나의문자가 있는지를 찾습니다.
찾는다면 그 문자가 나타난 맨마지막의 위치를 숫자로 반환합니다.
반환되는 숫자는 0부터 시작하는 정수입니다. 찾기에 실패 할경우에는 false 를 반환합니다.

substr
이 함수는 php에 내장된 함수로서 첫번째 인자로 받은 문자열을 두번째 인자의 위치부터, 세번째 인자의 갯수만큼을 반환합니다. 세번째 인자가 생략된 경우에는 두번째 인자의 위치부터 문자열의 끝까지를 반환합니다.


위 save_image_from_resource 함수에서
$extension = strtolower(substr($path_save_file, strrpos($path_save_file, '.') + 1));
이부분은 넘어온 파일저장경로에서 . 이 맨 마지막으로 위치한 것을 찾아서 그 위치값을 가져와서, 그 위치의 한칸뒤부터 끝까지 문자열을 잘라온 후에 소문자로 변환한 것을 $extension 변수에 담는 것입니다.
즉, dddd/sdssd.sddds.GIF 라는 문자열이 있으면, 먼저 맨마지막 . 의 위치를 찾고 그다음 GIF를 가져와서 gif로 변환해서 변수에 담는다는 뜻입니다.

※ 함수를 만들때 이름을 잘 짓는 것이 중요한데, 함수명만 보고도 이 함수가 무슨 역활을 알수 있는게 중요합니다.
이렇게 해야 하는 이유는 프로그램을 만든후 나중에 수정할 일이 생기거나 했을때 헤매지 않고 쉽게 처리하기 위해서 입니다. 변수도 같은 이유로 이름을 잘 짓는 것이 중요합니다.


이전에 했던 내용을 기초로 새로 만든 함수를 사용하여 수정하여 보겠습니다.

예제2 : test3.php
<?php

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

$path_file1 = 'sample_image/nofile.jpg';//존재하지 않는 파일
$path_file2 = 'sample_image/test.jpg';//실제 존재하는 원본파일
$path_copyfile1 = 'sample_image/test_copy.gif';//이미 이전 테스트에서 생성한 이미지
$path_copyfile2 = 'sample_image/test_copy_.gif';
$path_copyfile3 = 'sample_image/test_copy_.jpg';
$path_copyfile4 = 'sample_image/test_copy_.png';
$path_copyfile5 = 'sample_image/test_copy';//확장자가 없는 이미지 저장경로

//이미지 리소스를 받아온다.
$im1 = get_image_resource_from_file ($path_file1);
if ($im1 === false) echo $GLOBALS['errormsg'] . "<br />\n";

$im2 = get_image_resource_from_file ($path_file2);
if ($im2 === false) echo $GLOBALS['errormsg'] . "<br />\n";

//이미지를 새로운 이름으로 저장한다.
$result_save1 = save_image_from_resource ($im2, $path_copyfile1);
if ($result_save1 === false) echo $GLOBALS['errormsg'] . "<br />\n";
else echo $path_copyfile1 . " 에 이미지가 복사되었습니다.<br />\n";

$result_save2 = save_image_from_resource ($im2, $path_copyfile2);
if ($result_save2 === false) echo $GLOBALS['errormsg'] . "<br />\n";
else echo $path_copyfile2 . " 에 이미지가 복사되었습니다.<br />\n";

$result_save3 = save_image_from_resource ($im2, $path_copyfile3);
if ($result_save3 === false) echo $GLOBALS['errormsg'] . "<br />\n";
else echo $path_copyfile3 . " 에 이미지가 복사되었습니다.<br />\n";

$result_save4 = save_image_from_resource ($im2, $path_copyfile4);
if ($result_save4 === false) echo $GLOBALS['errormsg'] . "<br />\n";
else echo $path_copyfile4 . " 에 이미지가 복사되었습니다.<br />\n";
$result_save5 = save_image_from_resource ($im2, $path_copyfile5);

if ($result_save5 === false) echo $GLOBALS['errormsg'] . "<br />\n";
else echo $path_copyfile5 . " 에 이미지가 복사되었습니다.<br />\n";

@imagedestroy($im2);

?>
추천
6

댓글 12개

네에 쓰시는 것이면
썸네일 강좌 맨마지막 파일을 받으시기 바랍니다.

감사합니다.

http://sir.co.kr/bbs/board.php?bo_table=pg_lecture&wr_id=122
그거 둘의 차이는
앞에서 부터 찾냐 뒤에서 부터 찾냐 의 차이입니다.

strpos 는 찾고자 하는 문자를 앞에서 부터 찾고
strrpos 는 찾고자 하는 문자를 뒤에서 부터 찾습니다.

둘다 기본적으로는 첫번째 찾아진 위치를 반환 합니다.
아!!!!
앞과 뒤 차이군요...
어쩐지 eregi대신 사용했던 strpos의 동작이 부분적으로 오류를 보였던것은 앞에서 부터 찾았기 때문이네요~!

역시 사람은 알아야 되네요 ㅋㅋㅋ
GLOBALS나 php 내장함수를 설명없이 사용해오다가 갑자기 언어자체를 처음배우는사람에게 설명하듯 함수의 정의를 갑자기 설명하는건 뜬금없네요. 하지만 내용은 너무좋아서 잘따라하고 있습니다
전체 17
개발강좌 내용 검색 썸네일에서

회원로그인

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