缩小与php imagick

时间:2016-12-19 09:42:06

标签: php image-resizing imagick

我无法使用imagick限制pdf-to-jpg转换器的输出,但我似乎无法找到适合仅调整大于1600万像素图像的解决方案。

https://stackoverflow.com/a/6387086/3405380有我正在寻找的解决方案,但我找不到与convert -resize '180000@>' screen.jpg相同的PHP(在我的情况下,这将是'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;
}

1 个答案:

答案 0 :(得分:1)

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;
}

应该工作。