2009-09-23 5 views
0

이미지 업로드 양식이 있으며 사용자가 aimage 파일을 첨부하고 업로드 된 이미지 파일 (200kb, 500kb, 1mb, 5mb, 원본)의 크기를 조정할 이미지 크기를 선택합니다. 그런 다음 스크립트에서 사용자의 선택적 크기에 따라 이미지 파일 크기를 조정해야하지만이 기능을 구현하는 방법을 잘 모르겠습니다.이미지 파일의 크기를 임의 크기로 조정하는 방법

예를 들어 사용자가 1MB 크기의 이미지를 업로드하고 사용자가 200KB를 선택하여 크기를 조정하면 스크립트는 200kb 크기로 저장해야합니다.

비슷한 작업을 아는 사람이나 경험이있는 사람이 있습니까?

미리 답변 해 주셔서 감사합니다.

답변

5

GD library의 경우 imagecopyresampled()을 사용하십시오.

<?php 
// The file 
$filename = 'test.jpg'; 
$percent = 0.5; 

// Content type 
header('Content-type: image/jpeg'); 

// Get new dimensions 
list($width, $height) = getimagesize($filename); 
$new_width = $width * $percent; 
$new_height = $height * $percent; 

// Resample 
$image_p = imagecreatetruecolor($new_width, $new_height); 
$image = imagecreatefromjpeg($filename); 
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 

// Output 
imagejpeg($image_p, null, 100); 
?> 

편집 : 당신이 지정된 크기에 이미지 파일의 크기를 조정하려면, 즉 좀 더 열심히합니다. 모든 주요 이미지 형식은 압축을 사용하며 압축률은 압축되는 특성에 따라 다릅니다. 맑은 푸른 하늘을 압축하면 바다보다 더 나은 압축률을 얻을 수 있습니다.

당신이 할 수있는 최선의 방법은 특정 크기를 시도하고 필요한 경우 파일 크기를 확인하는 것입니다.

Resize ratio = desired file size/actual file size 
Resize multipler = square root (resize ratio) 
New height = resize multiplier * actual height 
New width = resize multiplier * actual width 

이것은 기본적으로 예상되는 압축 비율의 근사를 결정합니다. 나는 당신이 약간의 관용 (+/- 5 %와 같은)을 가질 것이고, 필요에 따라 숫자를 조정할 수 있다고 기대할 것입니다.

특정 파일 크기로 직접 조정할 수있는 방법은 없습니다. 마지막으로 특정 파일 크기에 대한 크기 조정이 다소 이상하다는 것을 추가 할 것입니다. 특정 높이 및/또는 너비로 크기 조정 (가로 세로 비율 유지)은 훨씬 더 일반적이며 예상됩니다 (사용자 별).

업데이트 : 제대로 지적 되었 듯이 파일 크기가 잘못되었습니다. 이 비율은 두 번 적용 할 때 파일 크기 비율의 제곱근이어야합니다 (한 번 높이, 한 번 너비까지). PHP에서 제공하는 GD 라이브러리 사용

+0

분수 구성 요소 "크기 조정 비율"이 제곱되기 때문에 원하는 크기의 파일로 끝납니다. 1MB 이미지가 있고 약 512KB 파일이 필요한 경우 newheight = sqrt (2) * height (너비와 마찬가지로) – dcrosta

+0

유용한 메모를 주셔서 감사합니다. – taras

+0

@dcrosta : 꽤 맞습니다. mltiply에 sqrt (비율)로 고정됩니다. – cletus

2

:

// $img is the image resource created by opening the original file 
// $w and $h is the final width and height respectively. 
$width = imagesx($img);$height = imagesy($img); 
$ratio = $width/$height; 

if($ratio > 1){ 
// width is greater than height 
$nh = $h; 
$nw = floor($width * ($nh/$height)); 
}else{ 
$nw = $w; 
$nh = floor($height * ($nw/$width)); 
} 

//centralize image 
$nx = floor(($nw- $w)/2.0); 
$ny = floor(($nh-$h)/2.0); 

$tmp2 = imagecreatetruecolor($nw,$nh); 
imagecopyresized($tmp2, $img,0,0,0,0,$nw,$nh,$width,$height); 

$tmp = imagecreatetruecolor($w,$h); 
imagecopyresized($tmp, $tmp2,0,0,$nx,$ny,$w,$h,$w,$h); 

imagedestroy($tmp2);imagedestroy($img); 

imagejpeg($tmp, $final_file); 

원래의 이미지를 촬영하는 코드의이 작품은, 지정된 크기로 크기를 조정합니다. 먼저 이미지의 크기를 조정 한 다음 이미지를 잘라서 + 중앙 집중화하여 지정된 크기로 떨어 뜨립니다.

+0

이미지 크기 자체가 아닌 이미지 파일 크기의 크기를 조정하려는 경우 (예 : 사용자가 1MB 크기의 이미지를 업로드하는 경우), 사용자가 200KB를 선택하여 크기를 조정하면 스크립트에서 200kb 크기로 저장해야합니다. – taras

+0

다른 답변과 마찬가지로 저장 후 얼마만큼의 파일 크기에 대한 확실한 답이없는 경우 – mauris

관련 문제