Изменение размера изображения в зависимости от формата изображения php - PullRequest
2 голосов
/ 18 мая 2011

Я хочу новую высоту и ширину, на которые нужно изменить размер изображения. Есть два условия

  1. Ширина должна быть около 180px (170-180), но <180px (загруженное изображение всегда> 180)
  2. Высота должна быть не более 180 пикселей (загруженное изображение может быть или не быть> 180)

Ответы [ 2 ]

0 голосов
/ 23 мая 2011

Вам нужно всего несколько шагов:

1. scale = imageWidth / 180;
2. scale = (imageHeight/scale>180) ? imageHeight/180 : scale;

Первый установит масштабный коэффициент, необходимый для ширины 180 (на основании вашего комментария ВСЕГДА больше 180)

Второй проверит, будет ли высота больше 180 с этой шкалой. Если это так, то масштаб будет высота / 180. Если это не так, у вас уже есть максимальная высота.

Тогда вам также понадобятся шаги, чтобы получить фактическую ширину и высоту:

width = imageWidth/scale;
height = imageHeight/scale;

Учитывая, что вы хотите сделать imageWidth между 170 и 180, я думаю, обрезка изображения также возможна. Если это так, вам нужна дополнительная проверка

if (width<170) {
  width = 170;
  height = imageHeigh / (imageWidth/170);
  //resize image to width and height
  //crop image to height = 180
}
0 голосов
/ 18 мая 2011

Если вы пишете программу для Linux, я бы порекомендовал использовать ImageMagick. Это более эффективно использует память и, вероятно, быстрее, чем любой метод на основе PHP. Почти на всех серверах он установлен. Следующий код поможет вам.

function resizeTo($source, $dest, $w=180, $h=180) {
    system("convert $source -resize {$w}x{$h} $dest");
}

Он будет учитывать соотношение сторон.

Edit:

Извините за путаницу. Я думаю, что следующее должно делать то, что вы ищете. Он не проверен и может потребовать небольшой отладки, если у вас возникнут проблемы, я могу попытаться опубликовать снова.

//accepts and returns point object (having ->x and ->y)
function resizeTo($current, $max) {
   if($current->x <= $max->x && $current->y <= $max->y) //you will not need this but
       return $current;                                 // still its good to have

   if( ($current->y / $max->y) > ($current->x / $max->x) ) { //y axis needs more trimming
       $r=$current->y / $max->y;
       $current->y = $max->y;
       $current->x = $current->x / $r;
   } else {
       $r=$current->x / $max->x;
       $current->x = $max->x;
       $current->y = $current->y / $r;
   }

   return $current;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...