如何用想象库填充缩略图

时间:2013-09-17 07:53:46

标签: php php-imagine

我使用imag库为图像创建缩略图。就这么简单。

$size = new \Imagine\Image\Box(240, 180);
$imagine->open($source_path)->thumbnail($size, 'inset')->save($target_path);

该库提供两种模式:插入和出站。在插入模式下,图像调整大小但不填充缩略图大小。所以我需要填充它来填充目标大小。有没有一种使用库函数的简单方法?

3 个答案:

答案 0 :(得分:6)

如果您不想“缩放”缩略图以适合,则必须裁剪图像。对于裁剪,你必须找到确切的起点,这需要一点点努力。

编写自定义方法以查找精确的裁剪点,调整大小并返回新图像是个好主意。 Imagine是一个非常好的库,它提供了我们需要的所有方法。

要遵循的步骤:

  1. 使用getSize()
  2. 获取原始图像的尺寸
  3. 通过比较宽度和高度来检测图像的方向。
  4. 然后根据方向找到确切的裁剪点,无需“缩放”即可适应新缩略图:
    • 如果是横向,请使用目标框的宽度
    • 查找目标宽度
    • 否则使用身高。
  5. 使用THUMBNAIL_OUTBOUND调整图像大小并创建“小大缩略图”。
  6. 使用您之前找到的裁剪点裁剪尺寸调整后的图像。
  7. 返回图像实例。
  8. 伪代码:

    function resizeToFit( $targetWidth, $targetHeight, $sourceFilename )
    {
        // Box is Imagine Box instance
        // Point is Imagine Point instance
        $target = new Box($targetWidth, $targetHeight );
        $originalImage = imagine->open( $sourceFilename );
        $orgSize = $originalImage->getSize();
        if ($orgSize->width > $orgSize->height) {
           // Landscaped.. We need to crop image by horizontally
           $w = $orgSize->width * ( $target->height / $orgSize->height );
           $h =  $target->height;
           $cropBy = new Point( ( max ( $w - $target->width, 0 ) ) / 2, 0);
        } else {
           // Portrait..
           $w = $target->width; // Use target box's width and crop vertically
           $h = $orgSize->height * ( $target->width / $orgSize->width );
           $cropBy = new Point( 0, ( max( $h - $target->height , 0 ) ) / 2);
        }
    
        $tempBox = Box($w, $h);
        $img = $originalImage->thumbnail($tempBox, ImageInterface::THUMBNAIL_OUTBOUND);
        // Here is the magic..
        return $img->crop($cropBy, $target); // Return "ready to save" final image instance
    }
    

答案 1 :(得分:1)

我已设法使用以下功能填充缩略图。

function pad(\Imagine\Gd\Imagine $img, \Imagine\Image\Box $size, $fcolor='#000', $ftransparency = 100)
    {
        $tsize = $img->getSize();
        $x = $y = 0;
        if ($size->getWidth() > $tsize->getWidth()) {
            $x =  round(($size->getWidth() - $tsize->getWidth()) / 2);
        } elseif ($size->getHeight() > $tsize->getHeight()) {
            $y = round(($size->getHeight() - $tsize->getHeight()) / 2);
        }
        $pasteto = new \Imagine\Image\Point($x, $y);
        $imagine = new \Imagine\Gd\Imagine();
        $color = new \Imagine\Image\Color($fcolor, $ftransparency);
        $image = $imagine->create($size, $color);

        $image->paste($img, $pasteto);

        return $image;
    }

答案 2 :(得分:0)

很高兴,感谢您的评论,这对我帮助很大! 但对我来说更好的是:

$img->resize($tempBox);

而不是:

 $img = $originalImage->thumbnail($tempBox, ImageInterface::THUMBNAIL_OUTBOUND);

也许它会帮助某人。