PHP обрезать изображение, чтобы зафиксировать ширину и высоту без потери соотношения размеров - PullRequest
12 голосов
/ 15 июля 2010

Я ищу создание миниатюр размером от 100 до 100 пикселей.Я видел много статей, объясняющих методы, но в большинстве случаев ширина = высота, если нужно сохранить соотношение размеров. Например,

, у меня изображение 450 на 350 пикселей.Я хотел бы обрезать до 100 пикселей на 100 пикселей.если бы я сохранил соотношение, у меня получилось бы 100 на 77 пикселей.это делает это уродливым, когда я перечисляю эти изображения в строке и столбце.тем не менее, изображение без размерного соотношения также будет выглядеть ужасно.

Я видел изображения с flickr, и они выглядят фантастически.например:
миниатюра: http://farm1.static.flickr.com/23/32608803_29470dfeeb_s.jpg
средний размер: http://farm1.static.flickr.com/23/32608803_29470dfeeb.jpg
большой размер: http://farm1.static.flickr.com/23/32608803_29470dfeeb_b.jpg

ткс

Ответы [ 5 ]

38 голосов
/ 15 июля 2010

Это делается с использованием только части изображения в качестве миниатюры, имеющей соотношение сторон 1: 1 (в основном, центр изображения).Если вы посмотрите внимательно, вы можете увидеть это на миниатюре flickr.

Поскольку в вашем вопросе есть «обрезка», я не уверен, что вы этого еще не знали, но что вы хотите знать тогда?

Чтобы использовать обрезку, здесьВот пример:

//Your Image
$imgSrc = "image.jpg";

//getting the image dimensions
list($width, $height) = getimagesize($imgSrc);

//saving the image into memory (for manipulation with GD Library)
$myImage = imagecreatefromjpeg($imgSrc);

// calculating the part of the image to use for thumbnail
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 = 100;
$thumb = imagecreatetruecolor($thumbSize, $thumbSize);
imagecopyresampled($thumb, $myImage, 0, 0, $x, $y, $thumbSize, $thumbSize, $smallestSide, $smallestSide);

//final output
header('Content-type: image/jpeg');
imagejpeg($thumb);
3 голосов
/ 23 марта 2017

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

Допустимы только jpg, jpeg и png.

function cropImage($sourcePath, $thumbSize, $destination = null) {

  $parts = explode('.', $sourcePath);
  $ext = $parts[count($parts) - 1];
  if ($ext == 'jpg' || $ext == 'jpeg') {
    $format = 'jpg';
  } else {
    $format = 'png';
  }

  if ($format == 'jpg') {
    $sourceImage = imagecreatefromjpeg($sourcePath);
  }
  if ($format == 'png') {
    $sourceImage = imagecreatefrompng($sourcePath);
  }

  list($srcWidth, $srcHeight) = getimagesize($sourcePath);

  // calculating the part of the image to use for thumbnail
  if ($srcWidth > $srcHeight) {
    $y = 0;
    $x = ($srcWidth - $srcHeight) / 2;
    $smallestSide = $srcHeight;
  } else {
    $x = 0;
    $y = ($srcHeight - $srcWidth) / 2;
    $smallestSide = $srcWidth;
  }

  $destinationImage = imagecreatetruecolor($thumbSize, $thumbSize);
  imagecopyresampled($destinationImage, $sourceImage, 0, 0, $x, $y, $thumbSize, $thumbSize, $smallestSide, $smallestSide);

  if ($destination == null) {
    header('Content-Type: image/jpeg');
    if ($format == 'jpg') {
      imagejpeg($destinationImage, null, 100);
    }
    if ($format == 'png') {
      imagejpeg($destinationImage);
    }
    if ($destination = null) {
    }
  } else {
    if ($format == 'jpg') {
      imagejpeg($destinationImage, $destination, 100);
    }
    if ($format == 'png') {
      imagepng($destinationImage, $destination);
    }
  }
}
3 голосов
/ 21 января 2013

Кадрирование изображения с квадратом на основе меньшей ширины или высоты

 public function croppThis($target_url) {

    $this->jpegImgCrop($target_url);

 }

$ target_url - это имя изображения.

 public function jpegImgCrop($target_url) {//support



  $image = imagecreatefromjpeg($target_url);
  $filename = $target_url;
  $width = imagesx($image);
  $height = imagesy($image);
  $image_type = imagetypes($image); //IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP | IMG_XPM

  if($width==$height) {

   $thumb_width = $width;
   $thumb_height = $height;

  } elseif($width<$height) {

   $thumb_width = $width;
   $thumb_height = $width;

  } elseif($width>$height) {

   $thumb_width = $height;
   $thumb_height = $height;

  } else {
   $thumb_width = 150;
   $thumb_height = 150;
  }

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

  if ( $original_aspect >= $thumb_aspect ) {

     // If image is wider than thumbnail (in aspect ratio sense)
     $new_height = $thumb_height;
     $new_width = $width / ($height / $thumb_height);

  }
  else {
     // If the thumbnail is wider than the image
     $new_width = $thumb_width;
     $new_height = $height / ($width / $thumb_width);
  }

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

  // Resize and crop
  imagecopyresampled($thumb,
         $image,
         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);
  imagejpeg($thumb, $filename, 80);

 }
0 голосов
/ 07 мая 2019

Для завершения кода @SvenKoschnicke, есть небольшой инструмент для обработки других форматов изображений:

$sourceProperties = getimagesize($imgSrc);

 $width = $sourceProperties[0];

 $height = $sourceProperties[1];

 switch ($sourceProperties[2]) {

 case IMAGETYPE_PNG:
        $myImage = imagecreatefrompng($imgSrc); 
        break;

  case IMAGETYPE_GIF:
        $myImage = imagecreatefromgif($imgSrc); 
        break;

  case IMAGETYPE_JPEG:
        $myImage = imagecreatefromjpeg($imgSrc); 
        break;
 }
0 голосов
/ 15 июля 2010

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

...