我正在使用想象库为图像创建缩略图。就这么简单。
$size = new \Imagine\Image\Box(240, 180);
$imagine->open($source_path)->thumbnail($size, 'inset')->save($target_path);
该库提供两种模式:插入和出站。在插入模式下,图像会缩小,但不会填充缩略图大小。所以我需要填充它以填充目标大小。有没有一种简单的方法可以使用库函数来做到这一点?
我正在使用想象库为图像创建缩略图。就这么简单。
$size = new \Imagine\Image\Box(240, 180);
$imagine->open($source_path)->thumbnail($size, 'inset')->save($target_path);
该库提供两种模式:插入和出站。在插入模式下,图像会缩小,但不会填充缩略图大小。所以我需要填充它以填充目标大小。有没有一种简单的方法可以使用库函数来做到这一点?
如果您不想“缩放”缩略图以适合您,则必须裁剪图像。对于裁剪,您必须找到确切的起点,并且需要付出一些努力。
编写自定义方法来找到精确的裁剪点、调整大小并返回新图像是个好主意。Imagine 是一个非常好的库,它提供了我们需要的所有方法。
要遵循的步骤:
伪代码:
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
}
我设法用以下功能填充缩略图。
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;
}
foozy,谢谢你的评论,它对我帮助很大!但对我来说,这样做更好:
$img->resize($tempBox);
而不是这个:
$img = $originalImage->thumbnail($tempBox, ImageInterface::THUMBNAIL_OUTBOUND);
也许它会帮助某人。