개발자의 끄적끄적

[PHP]썸네일 이미지 만들기 본문

개발/php

[PHP]썸네일 이미지 만들기

효벨 2020. 8. 26. 01:00
728x90
반응형

[PHP]썸네일 이미지 만들기

 

파일이미지 정보 가져오기

 

list($width, $height, $type, $attr) = getimagesize($original_path);

 

 

 

 

썸네일 이미지를 만드는 과정.

 

엄밀히 말하자면 이미지를 축소시켜서 캐시에 저장하는 과정은 아래와 같다.

 

 

 

1. 원본이미지를 불러온다.

 

2. 새 이미지틀을 만든다. (포토샵에서 캔버스를 새로 여는 과정으로 생각 하면 됨)

 

3. 이미지틀에 원본이미지를 축소하여 붙여 넣는다.

 

4. 저장한다.

 

 

 

그럼 코드를 보자.

 

가로 500px, 세로 300px 크기인 'original.gif' 이미지를 가로 200px, 세로 100px 로 줄여서 'resized.gif'로 저장을 해보겠다.

 

 

 

// 원본 이미지를 불러온다.

 

$original_path="images/original.gif";

 

$origin_img=imagecreatefromgif($original_path);

 

 

 

// 새 이미지 틀을 만든다.

 

$new_img=imagecreatetruecolor(200,100); // 가로 200 픽셀, 세로 100 픽셀

 

 

 

// 이미지 틀에 원본 이미지를 축소하여 붙여 넣는다.

 

imagecopyresampled($new_img, $origin_img, 0, 0, 0, 0, 200, 100, 500, 300);

 

 

 

// 저장한다.

 

$save_path="images/resized.gif";

 

imagegif($new_img, $save_path);

 

 

 

위의 코드대로 하면 원본이미지 옆에 축소된 이미지가 생성되어있을 것이다.

 

물론, 위의 코드를 실행하기 전에 해당 폴더의 퍼미션 값을 확인하여야 할것이다.

 

 

 

위의 코드는 gif 파일 형식을 불러와서 저장할때이다.

 

만일 다른 파일 형식이라면

 

imagecreatefromgif($original_path);

 

imagegif($new_img, $save_path);

 

 

 

위 두개의 함수를 수정해주어야 한다.

 

 

 

jpg, jpeg 의 경우

 

 

imagecreatefromjpeg($original_path);

 

imagejpeg($new_img, $save_path);

 

 

 

 

bmp의 경우

 

 

imagecreatefromwbmp($original_path);

 

imagewbmp($new_img, $save_path);

 

 

 

 

png의 경우

 

 

imagecreatefrompng($original_path);

 

imagepng($new_img, $save_path);

 

 

 

 

 

 

그리고 가장 난해한 함수, 'imagecopyresampled'를 보자.

 

imagecopyresampled($new_img, $origin_img, 0, 0, $offset_x, $offset_y, $width, $height, $crop_width, $crop_height);

 

이제껏 내가 본 내장함수 중에 파라미터가 엄청 많다.

 

위 함수와 유사한 것으로 'imagecopyresized'가 있다. 파라미터는 동일하다.

 

다만 퀄리티가 'imagecopyresampled' 더 낳다고 한다.

 

 

 

그럼 파라미터에 대해 보자.

 

$new_img : 기존 이미지를 축소하여 붙여 넣을 대상

 

$origin_img: 기존 이미지

 

 

 

$offset_x : 기존 이미지의 영역을 기준점으로 부터 x축 좌표를 지정한다.

 

$offset_y : 기존 이미지의 영역을 기준점으로 부터 y축 좌표를 지정한다.

 

 

 

부연설명-

 

개념이 좀 헷갈리지만,

 

영역이 시작되는 곳은 우측 하단부터이다.

 

 

 

 

 

 

 

 

만일 offset_x를 15으로 하고 offset_y를 10로 한다면 아래와 같이 선택된다.

 

 

 

 

 

 

 

만일 원본 이미지 영역 전부를 선택하고자 한다면 각각 0으로 두면 전부 선택이 되는 것이다.

 

 

 

$width: 축소하고자 하는 이미지의 가로 길이

 

$height: 축소하고자 하는 이미지의 세로 길이

 

$crop_width: 원본이미지에서 잘라내고자 하는 영역의 가로길이

 

$crop_height: 원본이미지에서 잘라내고자 하는 영역의 세로길이

 

 

 

만일 원본이미지를 자르고 싶지 않다면 $crop_width와 $crop_height를 원본사이즈로 두면 된다.

 

 

 

자, 그런데....

 

$origin_img 다음에 있는 0 두개는 무엇일까?

 

바로 위에서 offset_x, offset_y에 대해 설명할때 언급했던 기준점의 좌표다.

 

그런데, x 좌표와 y좌표를 각각 0 으로 두었는데 우측 하단에 위치한다는 점에 유의를 하도록 해한다.

 

***********************************적용소스 ***********************************

 

 

    for ($i=0; $i<count($list); $i++) {
        $bg = $i%2 ? 0 : 1;
       
        /* list.php 를 편집안하고 여기서 걍 가져옴  */
        $data = sql_fetch(" select * from g4_board_file where bo_table = '$bo_table' and wr_id = '".$list[$i][wr_id]."' and bf_no = 0 ");

  $imgurl =  $bo_table."/";
  if($data[wr_1] != ""){
   $imgurl = "";
  }

 

 // 원본 이미지를 불러온다.

 if($data[bf_file] != ""){
  //마이그레이션 파일인지 구분
  if($data[wr_1] != "") $data_path = $g4[path]."/data/file";
  else  $data_path = $g4[path]."/data/file/$bo_table";

  $thumb_path = $g4[path]."/data/file/$bo_table/thumb";   

  @mkdir($thumb_path, 0707);
  @chmod($thumb_path, 0707);
  
  $org_file = $data[bf_file];
  $original_path = $data_path."/".$org_file;
  $save_path = $thumb_path."/".$org_file;

  if(!is_file($save_path) && is_file($original_path)){

    list($width, $height, $type, $attr) = getimagesize($original_path);

    $org_file = explode(".",$org_file);
    $org_type = $org_file[(count($org_file) -1)];
    $new_img=imagecreatetruecolor(300,200); // 가로 300 픽셀, 세로 200 픽셀

    if(strtolower($org_type) == "jpg" || strtolower($org_type) == "jpeg") $origin_img = imagecreatefromjpeg($original_path);
    else if(strtolower($org_type) == "gif") $origin_img = imagecreatefromgif($original_path);
    else if(strtolower($org_type) == "bmp") $origin_img = imagecreatefromwbmp($original_path);
    else if(strtolower($org_type) == "png") $origin_img = imagecreatefromjpeg($original_path);
    
    imagecopyresampled($new_img, $origin_img, 0, 0, 0, 0, 300, 200, $width, $height);

    if(strtolower($org_type) == "jpg" || strtolower($org_type) == "jpeg") imagejpeg($new_img, $save_path);
    else if(strtolower($org_type) == "gif") imagegif($new_img, $save_path);
    else if(strtolower($org_type) == "bmp") imagewbmp($new_img, $save_path);
    else if(strtolower($org_type) == "png") imagejpeg($new_img, $save_path);
    


  }

 }

 

***********************************적용소스 ***********************************



출처: https://superes.tistory.com/65 [SUPERES DEV]

반응형
Comments