2013-08-26 2 views
0

Я пытаюсь изменить размер (сохраняя пропорции) и обрезать избыток изображения (вне пределов миниатюр), но при этом обрезать x = center и y = top.Изменение размера и обрезания в центре по центру

Мне ничего не хватает здесь, но мое окончательное изображение вписывается в область миниатюр, а не заполняет его и обрезает лишний. Надеюсь, кто-то может мне помочь в этом.

Это мой код, до сих пор:

$image_width = 725; // not static, just an example 
$image_height = 409; // not static, just an example 

// image can be wide or portrait 

$width = 140; 
$height = 160; 

$thumbnail = imagecreatetruecolor($width, $height); 
$white = imagecolorallocate($thumbnail, 255, 255, 255); 
imagefill($thumbnail, 0, 0, $white);   

$width_ratio = $image_width/$width; 
$height_ratio = $image_height/$height; 

if ($width_ratio>$height_ratio) { 
    $dest_width=$width; 
    $dest_height=$image_height/$width_ratio;   
} 
else{  
    $dest_width=$image_width/$height_ratio; 
    $dest_height=$height;   
} 

$int_width = ($width - $dest_width)/2; 
$int_height = ($height - $dest_height)/2;   

imagecopyresampled($thumbnail, $original_image, $int_width, $int_height, 0, 0, $dest_width, $dest_height, $image_width, $image_height); 

Спасибо!

ответ

1

Ваш $image_width, $image_height, $width и $height являются статическими, что означает $width_ratio и $height_ratio всегда они такие же как хорошо (соответственно: 5.1785714285714 и 2.55625, так что ширина отношение всегда выше, чем соотношение высоты).

В этом случае, этот блок кода:

if ($width_ratio>$height_ratio) { 
    $dest_width=$width; 
    $dest_height=$image_height/$width_ratio;   
} 
else{  
    $dest_width=$image_width/$height_ratio; 
    $dest_height=$height;   
} 

будет всегда работать if и не запускать else - удалить его и оставить просто:

$dest_width=$image_width/$height_ratio; 
$dest_height=$height; 

и ваше изображение будет обрезано Based при более высоком значении - в этом случае высота будет изменена в соответствии с новой высотой, и избыток ширины будет отключен.

Надеюсь, это то, что вы искали!

EDIT:

Сейчас сценарий, если отрезать края одинаково. Если вы хотите, чтобы они были полностью вырезаны из верхней или влево (в зависимости от соотношения), то:

Удалить эту часть кода полностью:

$int_width = ($width - $dest_width)/2; 
$int_height = ($height - $dest_height)/2; 

Изменить состояние ifelse упоминалось ранее в:

if($width_ratio < $height_ratio) { 
    $dest_width=$width; 
    $dest_height=$image_height/$width_ratio; 

    $int_width = ($width - $dest_width)/2; 
    $int_height = 0; 
} else {  
    $dest_width=$image_width/$height_ratio; 
    $dest_height=$height; 

    $int_width = 0; 
    $int_height = ($height - $dest_height)/2; 
} 

РЕДАКТИРОВАТЬ 2

Горизонтальные всегда отрезан одинаково, вертикальные всегда из верхней части - как вы хотели:

if($width_ratio < $height_ratio) { 
    $dest_width=$width; 
    $dest_height=$image_height/$width_ratio; 
} else {  
    $dest_width=$image_width/$height_ratio; 
    $dest_height=$height; 
} 

$int_width = ($width - $dest_width)/2; 
$int_height = 0; 
+0

Prajsnar Исходный размер изображения не фиксирован, это был только пример. Мне плохо, что я этого не сказал. Althou делает то, что вы сказали, это работало для горизонтального изображения, но как насчет вертикальных изображений? – MGP

+0

Просто измените условие '' '' '' '' '' '' '' '' '' ', которое должно это сделать. (Состояние, о котором я упомянул ранее) –

+0

Prajsnar Это сработало! Единственное, что мне сейчас не хватает, - это урожай, всегда начинающийся с вершины (хотя бы 0 сделал бы) .. и не вертикальный центр .. – MGP

Смежные вопросы