【问题标题】:PHP - Create Thumbnail & maintaining aspect ratioPHP - 创建缩略图并保持纵横比
【发布时间】:2014-06-02 15:34:22
【问题描述】:

编辑:这可以在 CSS 中轻松完成,我在写这篇文章时对 CSS 了解不多

我使用 PHP 创建了一个缩略图创建器。生成的缩略图应具有相同的大小。但问题是使用上传具有不同纵横比的图像,如横向或纵向,缩略图变得难看。因此,我创建了上面的图片以进行澄清。无论上传的图片是什么,它都会被放入一个矩形图片中。所以纵横比不会改变,缩略图将具有相同的大小。任何人都可以帮助我或告诉我一些想法吗?

【问题讨论】:

标签: php image gd image-resizing


【解决方案1】:
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

使用该代码,您将获得类似于

【讨论】:

  • 第 37 行,需要为 $img_disp = imagecreatetruecolor(THUMBNAIL_IMAGE_MAX_WIDTH, THUMBNAIL_IMAGE_MAX_HEIGHT); (将第二个参数替换为 THUMBNAIL_IMAGE_MAX_HEIGHT)。
  • 这不适用于带有黑色文本的 PNG 透明图像,会创建一个黑色图像缩略图。
【解决方案2】:

看我的Mr Thumb Image Resizing的源码。 :)

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!';
    }
}

【讨论】:

  • 我是 PHP 新手。你能告诉我如何调用这个函数,把文件名放在哪里,这样的目的地吗??
  • @user3392772 点击链接。查看example.php phpclasses.org/browse/file/28565.html 下的使用示例动态定义宽度/高度&lt;img src="example.php?i=images/myimage.jpg&amp;w=200&amp;h=300" alt="My Image" /&gt;
【解决方案3】:

这是一个可以帮助您的功能。你告诉它你想要保持的宽度,它会在保持纵横比的同时生成一个缩略图。

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);
    }
}

【讨论】:

  • @lewisd 我试过这个。它只是调整图像大小,而不是根据我在图片中显示的那个
【解决方案4】:

使用 ImageMagick API。看看这个

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-imagemagickhttp://in1.php.net/manual/en/class.imagick.php

【讨论】:

  • 我使用函数 makeThumbnail('test.jpg','new.jpg');但什么都没有发生
  • 你必须安装 ImageMagick。检查这个 - php.net/manual/en/imagick.setup.php
  • 安装在服务器上怎么样?有可能吗?
  • 是的,这绝对是可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2013-03-04
  • 2015-05-06
  • 2023-01-13
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多