이미지크롭관련 질문드립니다. 채택완료
안녕하세요 이미지 크롭관련 질문 드립니다.
원본사이즈 : 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개
세로, 가로 긴 값을 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개
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인