【问题标题】:PHP Imagick: copy image object to another image object but with bigger resolutionPHP Imagick:将图像对象复制到另一个图像对象但分辨率更高
【发布时间】:2012-10-11 02:17:19
【问题描述】:

为什么这不起作用?

var_dump($Obj_old_image->getImageResolution());
//array(2) { ["x"]=> float(72) ["y"]=> float(72) } 

$Obj_new_image->setResolution(200, 200);

var_dump($Obj_new_image->getImageResolution());
//array(2) { ["x"]=> float(200) ["y"]=> float(200) } 

$Obj_new_image->setImage($Obj_old_image);

$Obj_new_image->setImageFormat("png");
header("Content-Type: image/png");
echo $Obj_new_image;

它返回相同的分辨率。

这应该在不损失质量的情况下调整 SVG 图像的大小。

【问题讨论】:

  • 不,它不重复,忘记 SVG 我需要将图像从一个 imagick 对象加载到另一个更大尺寸的 imagick 对象。就像您将 JPEG 文件中的图像加载到 imagick 对象中并调整它的大小。

标签: php resize imagick


【解决方案1】:

根据您发布的代码,我不知道$Obj_old_image 是什么或它在做什么。然而,以下代码将适用于 PHP 和安装的标准 GD 库:

// image to be scaled
$rawImgPath = './test.jpg';

// new image size (guessing you know the new size)
$newImgSize['w'] = 200;
$newImgSize['h'] = 200;

// the steps to create the new scaled image
$rawImg = imagecreatefromjpeg($rawImgPath);
$newImg = imagecreatetruecolor($newImgSize['w'], $newImgSize['h']);

// need to know the current width and height of the source image
list($rawImgSize['w'], $rawImgSize['h']) = getimagesize($rawImgPath);

// resize the iamge
imagecopyresampled($newImg,$rawImg, 0,0,0,0,
    $newImgSize['w'],$newImgSize['h'],$rawImgSize['w'],$rawImgSize['h']);

// no longer need the original
imagedestroy($rawImg);

// display scaled image
header('Content-Type: image/png');
imagepng($newImg);

// no longer need the scaled image
imagedestroy($newImg);

这段代码应该可以工作并给出更好的结果,但对我来说不适合。基本上,imagescale() 是新代码,在 PHP 网站上是 not well document

// image to be scaled
$rawImgPath = './test.jpg';

// new image size (guessing you know the new size)
$newImgSize['w'] = 200;
$newImgSize['h'] = 200;

// the steps to create the new scaled image
$rawImg = imagecreatefromjpeg($rawImgPath);
$newImg = imagescale($rawImg, $newImgSize['w'], $newImgSize['h'],
    IMG_BICUBIC_FIXED);

// no longer need the original
imagedestroy($rawImg);

// display scaled image
header('Content-Type: image/png');
imagepng($newImg);

// no longer need the scaled image
imagedestroy($newImg);

【讨论】:

    【解决方案2】:

    只需使用 PHP 的原生 clone keyword 复制 Imagick 实例。

    $smallImg = new Imagick('small.png')
    $newImg = clone $smallImg;
    
    $newImg->resizeImage(200, 200, Imagick::FILTER_LANCZOS, 1, true);
    
    $newImg->setImageFormat("png");
    header("Content-Type: image/png");
    echo $newImg;
    

    resizeImagebestfit 参数(最后一个布尔值)是扩大规模所必需的。没有它,Imagick 只会缩小,保持较小的图像不变。

    Imagick::resizeImage docs 上的评论比较了各种调整大小过滤器的速度。我使用 Lanczos 取得了不错的成绩。

    【讨论】:

    • $newImg = clone $smallImg; 是我需要的,tnx @joemailer
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2020-02-15
    • 2018-11-04
    • 1970-01-01
    • 2014-07-31
    • 2014-11-20
    • 1970-01-01
    • 2022-06-30
    相关资源
    最近更新 更多