Ресайз изображений

Статус
В этой теме нельзя размещать новые ответы.

rasandrey

Участник
Регистрация
2 Апр 2009
Сообщения
214
Реакции
6
Подскажите, плиз, как правильно сделать ресайз изображений, чтобы в итоге получались картинки "квадратного" размера. Т.е. если у нас есть исходное изоражение 640*450, то как получить в итоге 100*100px?

У меня есть функция, но она ресайзит немного не так, например, с 640*450 мы получим, примерно 100*60px. Высмотрел я на одном сайте здесь thumb изображения все формата 158px × 119px и не зависимо, какого формата было исходное изоражение... Как они подгоняли под 158px × 119px для меня загадка
PHP:
function generate_thumbnail($fname, $thumb_fname, $max_x, $max_y)
{
  $ext = strtolower(preg_replace("/.+\.(.*)$/", "\\1", basename($fname)));
  switch ($ext) {
    case 'jpg':
    case 'jpeg':
      $im = imagecreatefromjpeg($fname);
    break;
 
    case 'gif':
      $im = imagecreatefromgif($fname);
    break;
 
    case 'png':
      $im = imagecreatefrompng($fname);
    break;
    
    default:
      return false;
    break;
  } // switch type
  if (@$im) {
    list($width, $height, $type, $attr) = getimagesize($fname);
    if (($width > $max_x) or ($height > $max_y)) {
      if ($width > $height) {
        $nw = $max_x;
        $nh = ($max_x / $width) * $height;
      }
      else {
        $nw = ($max_y / $height) * $width;
        $nh = $max_y;
      }
      $thumb = imagecreatetruecolor($nw, $nh);
      imagecopyresampled($thumb, $im, 0, 0, 0, 0, $nw, $nh, $width, $height);
      imagejpeg($thumb, $thumb_fname, 90);
      imagedestroy($thumb);
    } // need to resize
    else {
      copy($fname, $thumb_fname);
    } // just copy image
  } // created image
  else {
    return false;
  }
} // generate_thumbnail
 
например изменять размер пропорционально, центрировать и обрезать лишнее
PHP:
function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height) {
    //getting the image dimensions 
    list($width_orig, $height_orig) = getimagesize($imgSrc);  
    $myImage = imagecreatefromjpeg($imgSrc);
    $ratio_orig = $width_orig/$height_orig;
   
    if ($thumbnail_width/$thumbnail_height > $ratio_orig) {
       $new_height = $thumbnail_width/$ratio_orig;
       $new_width = $thumbnail_width;
    } else {
       $new_width = $thumbnail_height*$ratio_orig;
       $new_height = $thumbnail_height;
    }
   
    $x_mid = $new_width/2;  //horizontal middle
    $y_mid = $new_height/2; //vertical middle
   
    $process = imagecreatetruecolor(round($new_width), round($new_height));
   
    imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
    $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
    imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height);

    imagedestroy($process);
    imagedestroy($myImage);
    return $thumb;
}


$newThumb = CroppedThumbnail("image.jpg",100,100);

header('Content-type: image/jpeg');
imagejpeg($newThumb);
или css
HTML:
<div style="background:url('image.jpg') center center no-repeat; width:100px; height:100px;"></div>

<div style="width:100px;overflow:hidden;"><img src="image.jpg" height="100" /></div>
 
А как может картинка из неквадратной получиться квадратной? Пропорции, значит, надо менять или резать, как сказали выше. Но с какого боку резать, тоже еще вопрос.
 
я в соседней теме привел функцию.
Для просмотра ссылки Войди или Зарегистрируйся

она делает изображение по заданным ширине и высоте вне зависимости начатьного формата? И вопрос какие параметры передеаются в этих переменных $rgb=0xFFFFFF, $quality=100 ?
 
она делает изображение по заданным ширине и высоте вне зависимости начатьного формата?
Это можно протестить, ага?
И вопрос какие параметры передеаются в этих переменных $rgb=0xFFFFFF, $quality=100 ?
$rgb - цвет, по умолчанию - белый. Используется в строке 31:
PHP:
imagefill($idest, 0, 0, $rgb);
$quality - качество, по умолчанию 100%. Используется в строке 35:
PHP:
imagejpeg($idest, $dest, $quality);
 
я в соседней теме привел функцию.
Для просмотра ссылки Войди или Зарегистрируйся

функция изменяет размер до указанных параметров, но если в результате не пропорция, то он оставляет просто белые поля. А хотелось бы, чтобы фотка просто немного обрезалась, если не пропорция, чтобы полей никаких неыло

---------- Post added at 14:08 ---------- Previous post was at 12:55 ----------

например изменять размер пропорционально, центрировать и обрезать лишнее
PHP:
function CroppedThumbnail($imgSrc,$thumbnail_width,$thumbnail_height) {
    //getting the image dimensions 
    list($width_orig, $height_orig) = getimagesize($imgSrc);  
    $myImage = imagecreatefromjpeg($imgSrc);
    $ratio_orig = $width_orig/$height_orig;
    if ($thumbnail_width/$thumbnail_height > $ratio_orig) {
       $new_height = $thumbnail_width/$ratio_orig;
       $new_width = $thumbnail_width;
    } else {
       $new_width = $thumbnail_height*$ratio_orig;
       $new_height = $thumbnail_height;
    }
    $x_mid = $new_width/2;  //horizontal middle
    $y_mid = $new_height/2; //vertical middle
    $process = imagecreatetruecolor(round($new_width), round($new_height));
    imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig);
    $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height);
    imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height);
    imagedestroy($process);
    imagedestroy($myImage);
    return $thumb;
}
$newThumb = CroppedThumbnail("image.jpg",100,100);
header('Content-type: image/jpeg');
imagejpeg($newThumb);
или css
HTML:
<div style="background:url('image.jpg') center center no-repeat; width:100px; height:100px;"></div>
<div style="width:100px;overflow:hidden;"><img src="image.jpg" height="100" /></div>
то, что нужно, спасибо
 
цвет полей тоже задавать можно.
И в конце концов доработать функцию напильником тоже никто не запрещал ;)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху