我正在尝试对上传时我认为对我网站来说很大的每张图片进行缩减采样,因此当用户尝试上传图片时,我首先检查它是否具有可接受的分辨率,否则我想放弃此分辨率。我用于此的代码是:
if ($image->isValid()){
$imagick = new \Imagick();
$imagick->readImage($image);
$resolution = $imagick->getImageResolution();
$resolution_x = $resolution['x'];
$resolution_y = $resolution['y'];
if ($resolution_x > 30 && $resolution_y > 30){
$imagick->setImageResolution($resolution_x,$resolution_x);
$imagick->resampleImage($resolution_x/2,$resolution_x/2,\imagick::FILTER_CATROM,1);
}
$imagick->writeImage($uploadDir.$path);
}
此代码应设置分辨率为300 dpi的图像分辨率,例如150dpi。取而代之的是,分辨率保持300 dpi,图像尺寸下降到之前值的一半(例如图像(1200x800)变成(600x400))。我错过了关于Imagick :: resampleImage功能的一些信息,或者我的代码中是否有任何错误?在发布这个问题之前我已经做了很多搜索,并尝试了很多不同的方法来使用Imagick来完成我的目标,但我无法完成它!
答案 0 :(得分:0)
听起来像setImageResolution和resampleImage中的分辨率值应该相同。你试过这个吗?
$imagick->setImageResolution($resolution_x/2,$resolution_x/2);
答案 1 :(得分:0)
'决议'在setImageResolution和getImageResolution函数中,参考图像的每英寸点数设置,这是打印机打印图像的尺寸,即每英寸应打印多少个点的提示。
它不会影响图像的像素尺寸,因此对计算机上的图像没有明显影响,而计算机上的图像不使用DPI设置来渲染图像。
您只想使用$imagick->getImageWidth()
和$imagick->getImageHeight()
或$imagick->getImageGeometry()
来获取图片的像素大小,然后根据这些像素尺寸重新取样,而不是打印机提示设置。