使用 php imagick 缩小比例
Downscaling with php imagick
我在使用 imagick 限制 pdf-to-jpg 转换器的输出时遇到问题,但我似乎无法找到仅调整大于 16 兆像素的图像大小的正确解决方案。
有我正在寻找的解决方案,但我找不到 php 等同于 convert -resize '180000@>' screen.jpg
的方法(在我的例子中是 '16000000@>' ).我尝试了 $imagick->resizeImage(Imagick::RESOURCETYPE_AREA, 4000 * 4000);
,但这只会中断转换而不是调整大小。
public static function storeFilePdfToJpg($file) {
$destinationPath = public_path() . Config::get('my.image_upload_path');
$filename = str_random(10) . '_' . str_replace('.pdf', '', $file->getClientOriginalName()) . '.jpg';
$imagick = new Imagick();
$imagick->setResolution(350,350);
$imagick->readImage($file->getPathName());
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(100);
$imagick->resizeImage(Imagick::RESOURCETYPE_AREA, 4000 * 4000);
$imagick->writeImages($destinationPath . '/' . $filename, false);
return Config::get('my.full_image_upload_path') . $filename;
}
Image Magick 的 C api 不(afaik)公开此功能,因此 PHP Imagick 扩展不可能实现此功能。
这在 PHP 中很容易实现:
function openImageWithArea(int $desiredArea, string $filename) : Imagick
{
$image = new Imagick();
$dataRead = $image->pingImage($filename);
if (!$dataRead) {
throw new \Exception("Failed to ping image of filename $filename");
}
$width = $image->getImageWidth();
$height = $image->getImageHeight();
$area = $width * $height;
$ratio = $desiredArea / $area;
$desiredWidth = (int)($ratio * $width);
$desiredHeight = (int)($ratio * $height);
$imagick = new Imagick();
$imagick->setSize($desiredWidth, $desiredHeight);
$imagick->readImage($file);
return $imagick;
}
应该可以。
我在使用 imagick 限制 pdf-to-jpg 转换器的输出时遇到问题,但我似乎无法找到仅调整大于 16 兆像素的图像大小的正确解决方案。
有我正在寻找的解决方案,但我找不到 php 等同于 convert -resize '180000@>' screen.jpg
的方法(在我的例子中是 '16000000@>' ).我尝试了 $imagick->resizeImage(Imagick::RESOURCETYPE_AREA, 4000 * 4000);
,但这只会中断转换而不是调整大小。
public static function storeFilePdfToJpg($file) {
$destinationPath = public_path() . Config::get('my.image_upload_path');
$filename = str_random(10) . '_' . str_replace('.pdf', '', $file->getClientOriginalName()) . '.jpg';
$imagick = new Imagick();
$imagick->setResolution(350,350);
$imagick->readImage($file->getPathName());
$imagick->setImageCompression(imagick::COMPRESSION_JPEG);
$imagick->setImageCompressionQuality(100);
$imagick->resizeImage(Imagick::RESOURCETYPE_AREA, 4000 * 4000);
$imagick->writeImages($destinationPath . '/' . $filename, false);
return Config::get('my.full_image_upload_path') . $filename;
}
Image Magick 的 C api 不(afaik)公开此功能,因此 PHP Imagick 扩展不可能实现此功能。
这在 PHP 中很容易实现:
function openImageWithArea(int $desiredArea, string $filename) : Imagick
{
$image = new Imagick();
$dataRead = $image->pingImage($filename);
if (!$dataRead) {
throw new \Exception("Failed to ping image of filename $filename");
}
$width = $image->getImageWidth();
$height = $image->getImageHeight();
$area = $width * $height;
$ratio = $desiredArea / $area;
$desiredWidth = (int)($ratio * $width);
$desiredHeight = (int)($ratio * $height);
$imagick = new Imagick();
$imagick->setSize($desiredWidth, $desiredHeight);
$imagick->readImage($file);
return $imagick;
}
应该可以。