PHP – создание эскизов и сохранение пропорций

введите описание изображения здесь

Я создал создателя миниатюр, используя PHP. Созданные миниатюры должны быть одинакового размера. Но проблема заключается в том, что использование загружает изображения, имеющие разный формат изображения, например, пейзаж или портрет, миниатюра становится уродливой. Поэтому я создал картинку выше для уточнения. Каким бы ни было загруженное изображение, оно будет помещено в прямоугольное изображение. Таким образом, соотношение сторон не изменяется, а миниатюры будут одинакового размера. Может ли кто-нибудь помочь мне или рассказать некоторые идеи?

define('THUMBNAIL_IMAGE_MAX_WIDTH', 150); define('THUMBNAIL_IMAGE_MAX_HEIGHT', 150); function generate_image_thumbnail($source_image_path, $thumbnail_image_path) { list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path); switch ($source_image_type) { case IMAGETYPE_GIF: $source_gd_image = imagecreatefromgif($source_image_path); break; case IMAGETYPE_JPEG: $source_gd_image = imagecreatefromjpeg($source_image_path); break; case IMAGETYPE_PNG: $source_gd_image = imagecreatefrompng($source_image_path); break; } if ($source_gd_image === false) { return false; } $source_aspect_ratio = $source_image_width / $source_image_height; $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH / THUMBNAIL_IMAGE_MAX_HEIGHT; if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) { $thumbnail_image_width = $source_image_width; $thumbnail_image_height = $source_image_height; } elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) { $thumbnail_image_width = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio); $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT; } else { $thumbnail_image_width = THUMBNAIL_IMAGE_MAX_WIDTH; $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH / $source_aspect_ratio); } $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height); imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height); $img_disp = imagecreatetruecolor(THUMBNAIL_IMAGE_MAX_WIDTH,THUMBNAIL_IMAGE_MAX_WIDTH); $backcolor = imagecolorallocate($img_disp,0,0,0); imagefill($img_disp,0,0,$backcolor); imagecopy($img_disp, $thumbnail_gd_image, (imagesx($img_disp)/2)-(imagesx($thumbnail_gd_image)/2), (imagesy($img_disp)/2)-(imagesy($thumbnail_gd_image)/2), 0, 0, imagesx($thumbnail_gd_image), imagesy($thumbnail_gd_image)); imagejpeg($img_disp, $thumbnail_image_path, 90); imagedestroy($source_gd_image); imagedestroy($thumbnail_gd_image); imagedestroy($img_disp); return true; } generate_image_thumbnail('original_image.jpg', 'thumb_image.jpg'); //call the function 

с этим кодом вы получите нечто похожее на

введите описание изображения здесь

Посмотрите на исходный код моего изменения размера изображения мистера Thumb . 🙂

 public function proportion($max_width, $max_height) { if (!( $this->halt )) { if ($this->image['extension'] == 'gif') { $this->image['ratio'] = ( $this->image['width'] > $this->image['height'] ) ? $max_width / $this->image['width'] : $max_height / $this->image['height']; if ($this->image['width'] > $max_width || $this->image['height'] > $max_height) { $new_width = $this->image['width'] * $this->image['ratio']; $new_height = $this->image['height'] * $this->image['ratio']; } else { $new_width = $this->image['width']; $new_height = $this->image['height']; } $this->image['composite'] = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($this->image['composite'], $this->image['render'], 0, 0, 0, 0, $new_width, $new_height, $this->image['width'], $this->image['height']); $this->image['colorcount'] = imagecolorstotal($this->image['render']); imagetruecolortopalette($this->image['composite'], true, $this->image['colorcount']); imagepalettecopy($this->image['composite'], $this->image['render']); $this->image['transparentcolor'] = imagecolortransparent($this->image['render']); imagefill($this->image['composite'], 0, 0, $this->image['transparentcolor']); imagecolortransparent($this->image['composite'], $this->image['transparentcolor']); } else { $this->image['ratio'] = ( $this->image['width'] > $this->image['height'] ) ? $max_width / $this->image['width'] : $max_height / $this->image['height']; if ($this->image['width'] > $max_width || $this->image['height'] > $max_height) { $new_width = $this->image['width'] * $this->image['ratio']; $new_height = $this->image['height'] * $this->image['ratio']; } else { $new_width = $this->image['width']; $new_height = $this->image['height']; } $this->image['composite'] = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($this->image['composite'], $this->image['render'], 0, 0, 0, 0, $new_width, $new_height, $this->image['width'], $this->image['height']); } } else { echo 'Execution halted!'; } } 

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

 public static function makeThumb($src, $dest, $desired_width, $format = 'image/jpeg') { /* read the source image */ $source_image = null; if($format == 'image/jpeg') { $source_image = imagecreatefromjpeg($src); } else if($format == 'image/png') { $source_image = imagecreatefrompng($src); } $width = imagesx($source_image); $height = imagesy($source_image); /* find the "desired height" of this thumbnail, relative to the desired width */ $desired_height = floor($height * ($desired_width / $width)); /* create a new, "virtual" image */ $virtual_image = imagecreatetruecolor($desired_width, $desired_height); imageAlphaBlending($virtual_image, false); imageSaveAlpha($virtual_image, true); /* copy source image at a resized size */ imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height); /* create the physical thumbnail image to its destination */ if($format == 'image/jpeg') { imagejpeg($virtual_image, $dest); } else if($format == 'image/png') { imagepng($virtual_image, $dest); } } 

Используйте API ImageMagick. Проверьте это.

 define('THUMB_WIDTH', 60); define('THUMB_HEIGHT', 80); define('MAGICK_PATH','/usr/local/bin/'); function makeThumbnail($in, $out) { $width = THUMB_WIDTH; $height = THUMB_HEIGHT; list($w,$h) = getimagesize($in); $thumbRatio = $width/$height; $inRatio = $w/$h; $isLandscape = $inRatio > $thumbRatio; $size = ($isLandscape ? '1000x'.$height : $width.'x1000'); $xoff = ($isLandscape ? floor((($inRatio*$height)-$width)/2) : 0); $command = MAGICK_PATH."convert $in -resize $size -crop {$width}x{$height}+{$xoff}+0 ". "-colorspace RGB -strip -quality 90 $out"; exec($command); } 

См. Эту ссылку – http://coffeeshopped.com/2009/01/creating-image-thumbnails-using-php-and-imagemagick или http://in1.php.net/manual/en/class.imagick.php