Изменение размера большого изображения .tiff формат до определенного размера файла, используя ImageMagick и PHP - PullRequest
0 голосов
/ 01 мая 2019

Мне нужно изменить размер загруженного изображения в формате TIFF до определенного размера файла менее 95 кБ, используя imagick и php. Может кто-нибудь сказать мне лучший способ получить размер ниже 95 КБ?
Я использую код ниже, но с помощью этого кода иногда я получаю размер изображения больше, чем 95 КБ?

$filename = "test.jpg";
$image = new Imagick($filename);
$image->setImageCompressionQuality(int(40));
$img =  preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename).".tiff";
$image->writeImage($img);

Ответы [ 3 ]

1 голос
/ 06 мая 2019

Imagick имеет функцию для этого.

$filename = "test.jpg";
$image = new Imagick($filename);
// Setting your default compression
$compression_value = int(40);
// Imagick needs to know how to compress
$image->setImageCompression(COMPRESSION_JPEG);
$image->setImageCompressionQuality($compression_value);
// getImageLength gets the length of the file in bytes.
while ($image->getImageLength() > 95000) {
    $compression_value = $compression_value +1;
    $image->setImageCompressionQuality($compression_value);
}
$img =  preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename).".tiff";
$image->writeImage($img);

Примечание. При этом может потребоваться установить максимальное количество циклов, поскольку оно может просто поддерживать сжатие на более высоких и более высоких уровнях с уменьшениемвозвращается, тем выше вы идете.Обычно вы не идете выше 100, так что это будет моим рекомендацией.Если изображение не может быть сжатым до 95 КБ, возможно, вы захотите остановиться в какой-то момент.

0 голосов
/ 09 мая 2019

попробуйте этот код ...

// File and new size image

$filename = 'imagename.jpg';
$percent = 0.4;

// Content type

header('Content-Type: image/jpeg');

// Get new sizes image

list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// Load image

$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize image

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// result 

imagejpeg($thumb);
0 голосов
/ 07 мая 2019

Более эффективный ответ (еще более сложный), основанный на обсуждении моего другого вопроса между Данаком и мной (еще не проверял, все еще в процессе).

$filename = "test.jpg";
$image = new Imagick($filename);
// Setting your default compression
$height = $image->getImageHeight();
$width = $image->getImageWidth();
$raw_size = $height * $width;


// Imagick needs to know how to compress
$image->setImageCompression(COMPRESSION_JPEG);
$image->setImageCompressionQuality($compression_value);
// 80 compression shaves off about 40% of file size. Using that to estimate 
// 1% reduction for every 2 compression. This should be refined
// as more data is gained for your specific scenario.
 $compression_value = int(190/$raw_size);
// getImageLength gets the length of the file in bytes.
loop_refine($compression_value, $image);
while () {

}
// This reduces our size just a little more
$image->stripImage();
$img =  preg_replace('/\\.[^.\\s]{3,4}$/', '', $filename).".tiff";
$image->writeImage($img);

function loop_refine(&$compression_value, &$image){
    if ($image->getImageLength() > 95000 && $compression_value < 101){
        reduce_image_size($compression_value, $image);
    } elseif ($image->getImageLength() > 92000 && $compression_value < 101){
        increase_image_size($compression_value, $image);
    } else {
        return;
    }
}
function reduce_image_size(&$compression_value, &$image){
    $compression_value = $compression_value + int((101 - $compression_value)/2);
    $image->setImageCompressionQuality($compression_value);
    loop_refine($compression_value, $image);
}
function increase_image_size(&$compression_value, &$image){
    $compression_value = $compression_value - int((101- $compression_value)/4);
    $image->setImageCompressionQuality($compression_value);
    loop_refine($compression_value, $image);
}
...