2014-07-21 7 views
0

최대 너비 차원과 최대 파일 크기를 만족하는 이미지 파일을 업로드해야합니다.PHP - 파일 크기 제한을 충족하기 위해 이미지 압축

나는 너비 크기를 확인하고 최대 이미지 너비에 맞게 이미지의 크기를 조정하는 코드가 있습니다. 내가 파일을 저장하고 때

그러나, 나는 이미지가 제출 된 것으로 나는, 표준 품질을 설정하지 않도록하면된다 싶습니다 무엇

imagejpeg($imgObject , 'resized/50.jpg' , 50); //save image and set quality 

품질에서 매우 다양 품질을 설정할 수 있습니다 부족할 수 있습니다 우선 첫째로.

이미지의 품질은 최대 파일 크기 제한을 초과하지 않고 가능한 한 높게 설정해야합니다.

유일한 해결책은 이미지의 여러 버전을 다양한 품질로 저장하고 각 파일 크기를 확인하고 가장 좋은 파일을 선택하는 것입니다. 이것은 작동하지만 매우 느리고 프로세스 집중적입니다.

더 나은 방법에 대한 제안 사항이 있으십니까?

감사합니다.

+0

'다중 버전'경로로 이동하려는 경우 이전 결과의 평균을 기반으로 첫 번째 반복의 측정 기준을 선택하는 간단한 학습 알고리즘을 만들 수 있습니다. 이것은 알고리즘을 시간이 지남에 따라 더 효율적으로 만들 것입니다. – BazzyTK

답변

-1

최종 파일 크기를 예측하는 것은 JPEG 인코더의 내부 상태에 액세스 할 수 없기 때문에 수행 할 수있는 작업이 아닙니다.

당신이 할 수있는 한 가지는 이미지의 더 작은 버전을 압축하고 거기에서 추정합니다. 너비와 높이를 4 줄이면 컴퓨터가 픽셀의 16 분의 1 만 처리해야합니다. 트릭은 대표적인 테스트 이미지를 준비하는 방법입니다. imagecopyresampled() 또는 imagecopyresized()를 사용하여 이미지 크기를 줄이면 작동하지 않습니다. 압축 특성을 너무 많이 변경합니다.

$width1 = imagesx($img1); 
$height1 = imagesy($img1); 
$width2 = floor($width1/32) * 8; 
$height2 = floor($height1/32) * 8; 
$img2 = imagecreatetruecolor($width2, $height2); 
for($x1 = 0, $x2 = 0; $x2 + 8 < $width2; $x1 += 32, $x2 += 8) { 
    for($y1 = 0, $y2 = 0; $y2 + 8 < $height2; $y1 += 32, $y2 += 8) { 
     imagecopy($img2, $img1, $x2, $y2, $x1, $y1, 8, 8); 
    } 
} 

다양한 품질 수준에서 작은 이미지를 압축하고 존중 파일 크기를 얻을 대신, 당신이하고 싶은 원본 이미지에서 모든 넷째 8 × 8 타일을 복사합니다. 16을 곱하면 원본 이미지로 얻을 수있는 것의 합리적으로 좋은 추정치를 얻을 수 있습니다.

+0

흥미 롭습니다, 감사합니다. – user1017063

+0

예가 있습니까? – Bytemain

0

아니요. 가능한 한 최적입니다.