테스트 사이트 - 개발 중인 베타 버전입니다

이미지크롭관련 질문드립니다. 채택완료

sukja 4년 전 조회 2,197

안녕하세요 이미지 크롭관련 질문 드립니다.

원본사이즈 : 3024*4032

크롭된 사이즈 : 224 * 300

 

 

필요한 이미지 사이즈

300 * 224  >>> 이렇에 크롭되면 좋습니다.

가로 : 300   ---> 세로가 길어도 무조건 가로 기준으로 300사이즈로 크롭

 

조언 부탁드립니다.

 

/lib/thumbnail.lib.php

</strong></p>

<p>function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_height, $is_create, $is_crop=false, $crop_mode='center', $is_sharpen=false, $um_value='80/0.5/3')</p>

<p>{</p>

<p>global $g5;</p>

<p> </p>

<p>if(!$thumb_width && !$thumb_height)</p>

<p>return;</p>

<p> </p>

<p>$source_file = "$source_path/$filename";</p>

<p> </p>

<p>if(!is_file($source_file)) // 원본 파일이 없다면</p>

<p>return;</p>

<p> </p>

<p>$size = @getimagesize($source_file);</p>

<p>if($size[2] < 1 || $size[2] > 3) // gif, jpg, png 에 대해서만 적용</p>

<p>return;</p>

<p> </p>

<p>if (!is_dir($target_path)) {</p>

<p>@mkdir($target_path, G5_DIR_PERMISSION);</p>

<p>@chmod($target_path, G5_DIR_PERMISSION);</p>

<p>}</p>

<p> </p>

<p>// 디렉토리가 존재하지 않거나 쓰기 권한이 없으면 썸네일 생성하지 않음</p>

<p>if(!(is_dir($target_path) && is_writable($target_path)))</p>

<p>return '';</p>

<p> </p>

<p>// Animated GIF는 썸네일 생성하지 않음</p>

<p>if($size[2] == 1) {</p>

<p>if(is_animated_gif($source_file))</p>

<p>return basename($source_file);</p>

<p>}</p>

<p> </p>

<p>$ext = array(1 => 'gif', 2 => 'jpg', 3 => 'png');</p>

<p> </p>

<p>$thumb_filename = preg_replace("/\.[^\.]+$/i", "", $filename); // 확장자제거</p>

<p>$thumb_file = "$target_path/thumb-{$thumb_filename}_{$thumb_width}x{$thumb_height}.".$ext[$size[2]];</p>

<p> </p>

<p>$thumb_time = @filemtime($thumb_file);</p>

<p>$source_time = @filemtime($source_file);</p>

<p> </p>

<p>if (is_file($thumb_file)) {</p>

<p>if ($is_create == false && $source_time < $thumb_time) {</p>

<p>return basename($thumb_file);</p>

<p>}</p>

<p>}</p>

<p> </p>

<p>// 원본파일의 GD 이미지 생성</p>

<p>$src = null;</p>

<p>$degree = 0;</p>

<p> </p>

<p>if ($size[2] == 1) {</p>

<p>$src = @imagecreatefromgif($source_file);</p>

<p>$src_transparency = @imagecolortransparent($src);</p>

<p>} else if ($size[2] == 2) {</p>

<p>$src = @imagecreatefromjpeg($source_file);</p>

<p> </p>

<p>if(function_exists('exif_read_data')) {</p>

<p>// exif 정보를 기준으로 회전각도 구함</p>

<p>$exif = @exif_read_data($source_file);</p>

<p>if(!empty($exif['Orientation'])) {</p>

<p>switch($exif['Orientation']) {</p>

<p>case 8:</p>

<p>$degree = 90;</p>

<p>break;</p>

<p>case 3:</p>

<p>$degree = 180;</p>

<p>break;</p>

<p>case 6:</p>

<p>$degree = -90;</p>

<p>break;</p>

<p>}</p>

<p> </p>

<p>// 회전각도 있으면 이미지 회전</p>

<p>if($degree) {</p>

<p>$src = @imagerotate($src, $degree, 0);</p>

<p> </p>

<p>// 세로사진의 경우 가로, 세로 값 바꿈</p>

<p>if($degree == 90 || $degree == -90) {</p>

<p>$tmp = $size;</p>

<p>$size[0] = $tmp[1];</p>

<p>$size[1] = $tmp[0];</p>

<p>}</p>

<p>}</p>

<p>}</p>

<p>}</p>

<p>} else if ($size[2] == 3) {</p>

<p>$src = @imagecreatefrompng($source_file);</p>

<p>@imagealphablending($src, true);</p>

<p>} else {</p>

<p>return;</p>

<p>}</p>

<p> </p>

<p>if(!$src)</p>

<p>return;</p>

<p> </p>

<p>$is_large = true;</p>

<p>// width, height 설정</p>

<p>// if($thumb_width) {</p>

<p>// if(!$thumb_height) {</p>

<p>// $thumb_height = round(($thumb_width * $size[1]) / $size[0]);</p>

<p>// } else {</p>

<p>// if($crop_mode === 'center' && ($size[0] > $thumb_width || $size[1] > $thumb_height)){</p>

<p>// $is_large = true;</p>

<p>// // } else if($size[0] < $thumb_width || $size[1] < $thumb_height) {</p>

<p>// // $is_large = false;</p>

<p>// }</p>

<p>// }</p>

<p>// } else {</p>

<p>// if($thumb_height) {</p>

<p>// $thumb_width = round(($thumb_height * $size[0]) / $size[1]);</p>

<p>// }</p>

<p>// }</p>

<p> </p>

<p>$max=$thumb_width; // 여기서부터 추가 시작</p>

<p>if ( $size[0] > $size[1] ) {</p>

<p>$thumb_width = $max ;</p>

<p>$thumb_height = ceil( $size[1] * ( $max / $size[0] ) );</p>

<p>}</p>

<p>else if ( $size[0] < $size[1] ) {</p>

<p>$thumb_height = $max ;</p>

<p>$thumb_width = ceil( $size[0] * ( $max / $size[1] ) );</p>

<p>}</p>

<p>else if ( $size[0] == $size[1] ) {</p>

<p>$thumb_width = ceil( $max );</p>

<p>$thumb_height = ceil( $max );</p>

<p>} // 여기까지 끝</p>

<p> </p>

<p>$dst_x = 0;</p>

<p>$dst_y = 0;</p>

<p>$src_x = 0;</p>

<p>$src_y = 0;</p>

<p>$dst_w = $thumb_width;</p>

<p>$dst_h = $thumb_height;</p>

<p>$src_w = $size[0];</p>

<p>$src_h = $size[1];</p>

<p> </p>

<p>$ratio = $dst_h / $dst_w;</p>

<p> </p>

<p>if($is_large) {</p>

<p>// 크롭처리</p>

<p>if($is_crop) {</p>

<p>switch($crop_mode)</p>

<p>{</p>

<p>case 'center':</p>

<p>if($size[1] / $size[0] >= $ratio) {</p>

<p>$src_h = round($src_w * $ratio);</p>

<p>$src_y = round(($size[1] - $src_h) / 2);</p>

<p>} else {</p>

<p>$src_w = round($size[1] / $ratio);</p>

<p>$src_x = round(($size[0] - $src_w) / 2);</p>

<p>}</p>

<p>break;</p>

<p>default:</p>

<p>if($size[1] / $size[0] >= $ratio) {</p>

<p>$src_h = round($src_w * $ratio);</p>

<p>} else {</p>

<p>$src_w = round($size[1] / $ratio);</p>

<p>}</p>

<p>break;</p>

<p>}</p>

<p> </p>

<p>$dst = imagecreatetruecolor($dst_w, $dst_h);</p>

<p> </p>

<p>if($size[2] == 3) {</p>

<p>imagealphablending($dst, false);</p>

<p>imagesavealpha($dst, true);</p>

<p>} else if($size[2] == 1) {</p>

<p>$palletsize = imagecolorstotal($src);</p>

<p>if($src_transparency >= 0 && $src_transparency < $palletsize) {</p>

<p>$transparent_color = imagecolorsforindex($src, $src_transparency);</p>

<p>$current_transparent = imagecolorallocate($dst, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);</p>

<p>imagefill($dst, 0, 0, $current_transparent);</p>

<p>imagecolortransparent($dst, $current_transparent);</p>

<p>}</p>

<p>}</p>

<p>} else { // 비율에 맞게 생성</p>

<p>$dst = imagecreatetruecolor($dst_w, $dst_h);</p>

<p>$bgcolor = imagecolorallocate($dst, 255, 255, 255); // 배경색</p>

<p> </p>

<p>if ( !((defined('G5_USE_THUMB_RATIO') && false === G5_USE_THUMB_RATIO) || (defined('G5_THEME_USE_THUMB_RATIO') && false === G5_THEME_USE_THUMB_RATIO)) ){</p>

<p>if($src_w > $src_h) {</p>

<p>$tmp_h = round(($dst_w * $src_h) / $src_w);</p>

<p>$dst_y = round(($dst_h - $tmp_h) / 2);</p>

<p>$dst_h = $tmp_h;</p>

<p>} else {</p>

<p>$tmp_w = round(($dst_h * $src_w) / $src_h);</p>

<p>$dst_x = round(($dst_w - $tmp_w) / 2);</p>

<p>$dst_w = $tmp_w;</p>

<p>}</p>

<p>}</p>

<p> </p>

<p>if($size[2] == 3) {</p>

<p>$bgcolor = imagecolorallocatealpha($dst, 0, 0, 0, 127);</p>

<p>imagefill($dst, 0, 0, $bgcolor);</p>

<p>imagealphablending($dst, false);</p>

<p>imagesavealpha($dst, true);</p>

<p>} else if($size[2] == 1) {</p>

<p>$palletsize = imagecolorstotal($src);</p>

<p>if($src_transparency >= 0 && $src_transparency < $palletsize) {</p>

<p>$transparent_color = imagecolorsforindex($src, $src_transparency);</p>

<p>$current_transparent = imagecolorallocate($dst, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);</p>

<p>imagefill($dst, 0, 0, $current_transparent);</p>

<p>imagecolortransparent($dst, $current_transparent);</p>

<p>} else {</p>

<p>imagefill($dst, 0, 0, $bgcolor);</p>

<p>}</p>

<p>} else {</p>

<p>imagefill($dst, 0, 0, $bgcolor);</p>

<p>}</p>

<p>}</p>

<p>} else {</p>

<p>$dst = imagecreatetruecolor($dst_w, $dst_h);</p>

<p>$bgcolor = imagecolorallocate($dst, 255, 255, 255); // 배경색</p>

<p> </p>

<p>if ( ((defined('G5_USE_THUMB_RATIO') && false === G5_USE_THUMB_RATIO) || (defined('G5_THEME_USE_THUMB_RATIO') && false === G5_THEME_USE_THUMB_RATIO)) ){</p>

<p>//이미지 썸네일을 비율 유지하지 않습니다. (5.2.6 버전 이하에서 처리된 부분과 같음)</p>

<p> </p>

<p>if($src_w < $dst_w) {</p>

<p>if($src_h >= $dst_h) {</p>

<p>$dst_x = round(($dst_w - $src_w) / 2);</p>

<p>$src_h = $dst_h;</p>

<p>if( $dst_w > $src_w ){</p>

<p>$dst_w = $src_w;</p>

<p>}</p>

<p>} else {</p>

<p>$dst_x = round(($dst_w - $src_w) / 2);</p>

<p>$dst_y = round(($dst_h - $src_h) / 2);</p>

<p>$dst_w = $src_w;</p>

<p>$dst_h = $src_h;</p>

<p>}</p>

<p>} else {</p>

<p>if($src_h < $dst_h) {</p>

<p>$dst_y = round(($dst_h - $src_h) / 2);</p>

<p>$dst_h = $src_h;</p>

<p>$src_w = $dst_w;</p>

<p>}</p>

<p>}</p>

<p> </p>

<p>} else {</p>

<p>//이미지 썸네일을 비율 유지하며 썸네일 생성합니다.</p>

<p>if($src_w < $dst_w) {</p>

<p>if($src_h >= $dst_h) {</p>

<p>if( $src_h > $src_w ){</p>

<p>$tmp_w = round(($dst_h * $src_w) / $src_h);</p>

<p>$dst_x = round(($dst_w - $tmp_w) / 2);</p>

<p>$dst_w = $tmp_w;</p>

<p>} else {</p>

<p>$dst_x = round(($dst_w - $src_w) / 2);</p>

<p>$src_h = $dst_h;</p>

<p>if( $dst_w > $src_w ){</p>

<p>$dst_w = $src_w;</p>

<p>}</p>

<p>}</p>

<p>} else {</p>

<p>$dst_x = round(($dst_w - $src_w) / 2);</p>

<p>$dst_y = round(($dst_h - $src_h) / 2);</p>

<p>$dst_w = $src_w;</p>

<p>$dst_h = $src_h;</p>

<p>}</p>

<p>} else {</p>

<p>if($src_h < $dst_h) {</p>

<p>if( $src_w > $dst_w ){</p>

<p>$tmp_h = round(($dst_w * $src_h) / $src_w);</p>

<p>$dst_y = round(($dst_h - $tmp_h) / 2);</p>

<p>$dst_h = $tmp_h;</p>

<p>} else {</p>

<p>$dst_y = round(($dst_h - $src_h) / 2);</p>

<p>$dst_h = $src_h;</p>

<p>$src_w = $dst_w;</p>

<p>}</p>

<p>}</p>

<p>}</p>

<p>}</p>

<p> </p>

<p>if($size[2] == 3) {</p>

<p>$bgcolor = imagecolorallocatealpha($dst, 0, 0, 0, 127);</p>

<p>imagefill($dst, 0, 0, $bgcolor);</p>

<p>imagealphablending($dst, false);</p>

<p>imagesavealpha($dst, true);</p>

<p>} else if($size[2] == 1) {</p>

<p>$palletsize = imagecolorstotal($src);</p>

<p>if($src_transparency >= 0 && $src_transparency < $palletsize) {</p>

<p>$transparent_color = imagecolorsforindex($src, $src_transparency);</p>

<p>$current_transparent = imagecolorallocate($dst, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);</p>

<p>imagefill($dst, 0, 0, $current_transparent);</p>

<p>imagecolortransparent($dst, $current_transparent);</p>

<p>} else {</p>

<p>imagefill($dst, 0, 0, $bgcolor);</p>

<p>}</p>

<p>} else {</p>

<p>imagefill($dst, 0, 0, $bgcolor);</p>

<p>}</p>

<p>}</p>

<p> </p>

<p>imagecopyresampled($dst, $src, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);</p>

<p> </p>

<p>// sharpen 적용</p>

<p>if($is_sharpen && $is_large) {</p>

<p>$val = explode('/', $um_value);</p>

<p>UnsharpMask($dst, $val[0], $val[1], $val[2]);</p>

<p>}</p>

<p> </p>

<p>if($size[2] == 1) {</p>

<p>imagegif($dst, $thumb_file);</p>

<p>} else if($size[2] == 3) {</p>

<p>if(!defined('G5_THUMB_PNG_COMPRESS'))</p>

<p>$png_compress = 5;</p>

<p>else</p>

<p>$png_compress = G5_THUMB_PNG_COMPRESS;</p>

<p> </p>

<p>imagepng($dst, $thumb_file, $png_compress);</p>

<p>} else {</p>

<p>if(!defined('G5_THUMB_JPG_QUALITY'))</p>

<p>$jpg_quality = 90;</p>

<p>else</p>

<p>$jpg_quality = G5_THUMB_JPG_QUALITY;</p>

<p> </p>

<p>imagejpeg($dst, $thumb_file, $jpg_quality);</p>

<p>}</p>

<p> </p>

<p>chmod($thumb_file, G5_FILE_PERMISSION); // 추후 삭제를 위하여 파일모드 변경</p>

<p> </p>

<p>imagedestroy($src);</p>

<p>imagedestroy($dst);</p>

<p> </p>

<p>return basename($thumb_file);</p>

<p>}</p>

<p><strong>

 

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

답변 1개

채택된 답변
+20 포인트
4년 전

세로, 가로 긴 값을 width 로 변경하게 됩니다.

// 세로사진의 경우 가로, 세로 값 바꿈

해당 주석 값을 찾아 주석처리해주세요

 

$max=$thumb_width; // 여기서부터 추가 시작
if ( $size[0] > $size[1] ) {
$thumb_width = $max ;
$thumb_height = ceil( $size[1] * ( $max / $size[0] ) );
}
else if ( $size[0] < $size[1] ) {
$thumb_height = $max ;
$thumb_width = ceil( $size[0] * ( $max / $size[1] ) );
}
else if ( $size[0] == $size[1] ) {
$thumb_width = ceil( $max );
$thumb_height = ceil( $max );
} // 여기까지 끝

 

이 값 역시 아래 값으로 변경해주세요

 

$max=$thumb_width; // 여기서부터 추가 시작

$thumb_width = $max ;

$thumb_height = ceil( $size[1] * ( $max / $size[0] ) );

 

이렇게 처리하면 될 것 같습니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

s
sukja
4년 전
감사합니다. ^^~

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

답변을 작성하려면 로그인이 필요합니다.

로그인