2015-02-12 3 views
0

Я пытаюсь изменить сценарий загрузки, на данный момент я могу обрезать изображение на квадрат при изменении размера - отлично!Обрезание любого изображения до 4: 3

Однако я хотел был бы, чтобы пользователь мог загружать изображение любого размера, а для скрипта создавать 200x150, 400x300, 800x600 миниатюры/изображения - соотношение 4: 3.

Мой код до сих пор:

list($width,$height) = getimagesize($uploadedfile); 

if ($thumb == 1){ 
if ($width > $height) { 
    $y = 0; 
    $x = ($width - $height)/2; 
    $smallestSide = $height; 
} else { 
    $x = 0; 
    $y = ($height - $width)/2; 
    $smallestSide = $width; 
} 

// copying the part into thumbnail 
$thumbSize = 200; 
$tmp = imagecreatetruecolor($thumbSize, $thumbSize); 
imagecopyresampled($tmp, $src, 0, 0, $x, $y, $thumbSize, $thumbSize, $smallestSide, $smallestSide); 

// write thumbnail to disk 
$write_thumbimage = $folder .'/thumb-'. $image; 
switch($ext){ 
    case "gif": 
    imagegif($tmp,$write_thumbimage); 
    break; 
    case "jpg": 
    imagejpeg($tmp,$write_thumbimage,100); 
    break; 
    case "jpeg": 
    imagejpeg($tmp,$write_thumbimage,100); 
    break; 
    case "png": 
    imagepng($tmp,$write_thumbimage); 
    break; 
} 

Кто-нибудь знает требуемую формулу или может мне точку в правильном направлении?

+0

возможно дубликат [растениеводстве изображения до 4: 3 соотношение сторон C#] (http://stackoverflow.com/questions/18494403/crop-image-to-43-aspect-ratio-c-sharp) – halfer

+0

Если это математика, которую вы используете, чтобы рассчитать ширину и высоту для этого соотношения сторон, см. возможный дубликат. Это для C#, но из кода должно быть достаточно ясно, как это сделать. – halfer

+0

@halfer - Я после объяснения кода в PHP, а не C#, так что вряд ли дублирование? – potts

ответ

3

Разработал логику, используя некоторые из того, что было на языке C# дубликата:

$thumb_width = 200; 
$thumb_height = 150; 

$original_aspect = $width/$height; 
$thumb_aspect = $thumb_width/$thumb_height; 

if ($original_aspect >= $thumb_aspect) { 
    $new_height = $thumb_height; 
    $new_width = $width/($height/$thumb_height); 
} else { 
    $new_width = $thumb_width; 
    $new_height = $height/($width/$thumb_width); 
} 

$tmp = imagecreatetruecolor($thumb_width, $thumb_height); 

// Resize and crop 
imagecopyresampled($tmp, 
        $src, 
        0 - ($new_width - $thumb_width)/2, // Center the image horizontally 
        0 - ($new_height - $thumb_height)/2, // Center the image vertically 
        0, 0, 
        $new_width, $new_height, 
        $width, $height); 
Смежные вопросы