2016-12-19 2 views
2

imagickを使用してpdfからjpgへのコンバータの出力を制限するのに問題がありますが、16メガピクセル以上の画像のサイズを変更するだけでは解決できないようです。php imagickでダウンスケーリング

https://stackoverflow.com/a/6387086/3405380私が探している解決策がありますが、私はconvert -resize '[email protected]>' screen.jpg(私の場合は '16000000 @>'になる)のphp相当を見つけることができません。私は$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

イメージのC APIの魔術しない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; 
} 

は動作するはずです。

+0

ありがとうございました! – Draecko

関連する問題