好像您已经接受了答案,但我仍然会发布我的答案。
首先,你真的不需要使用100%的质量,90%或85%的值就可以了,同时减少你的处理时间和图像大小(如果你不相信我只是运行一些测试)。
我还用这个图像和一个自定义JPEG()
函数做了一些基准测试,第一个测试用例:
JPEG('./original.jpg', null, '1024*774', './output/large.jpg');
JPEG('./original.jpg', null, '500*378', './output/medium.jpg');
JPEG('./original.jpg', null, '240*161', './output/small.jpg');
JPEG('./original.jpg', null, '100*76', './output/thumb.jpg');
JPEG('./original.jpg', null, '50*38', './output/small_thumb.jpg');
JPEG('./original.jpg', null, '75*75', './output/square.jpg');
在我的慢速计算机上,这平均需要 60 秒。
第二个测试用例:
JPEG('./original.jpg', null, '1024*774', './output/large.jpg');
JPEG('./output/large.jpg', null, '500*378', './output/medium.jpg');
JPEG('./output/medium.jpg', null, '240*161', './output/small.jpg');
JPEG('./output/medium.jpg', null, '100*76', './output/thumb.jpg');
JPEG('./output/medium.jpg', null, '50*38', './output/small_thumb.jpg');
JPEG('./output/medium.jpg', null, '75*75', './output/square.jpg');
这个“只”需要 16 秒(我的电脑真的很慢 ATM :P),快了近 4 倍。
JPEG()
如果您想进行自己的基准测试,请使用以下功能:
function JPEG($source, $crop = null, $scale = null, $destination = null)
{
$source = ImageCreateFromJPEG($source);
if (is_resource($source) === true)
{
$size = array(ImageSX($source), ImageSY($source));
if (isset($crop) === true)
{
$crop = array_filter(explode('/', $crop), 'is_numeric');
if (count($crop) == 2)
{
$crop = array($size[0] / $size[1], $crop[0] / $crop[1]);
if ($crop[0] > $crop[1])
{
$size[0] = $size[1] * $crop[1];
}
else if ($crop[0] < $crop[1])
{
$size[1] = $size[0] / $crop[1];
}
$crop = array(ImageSX($source) - $size[0], ImageSY($source) - $size[1]);
}
else
{
$crop = array(0, 0);
}
}
else
{
$crop = array(0, 0);
}
if (isset($scale) === true)
{
$scale = array_filter(explode('*', $scale), 'is_numeric');
if (count($scale) >= 1)
{
if (empty($scale[0]) === true)
{
$scale[0] = $scale[1] * $size[0] / $size[1];
}
else if (empty($scale[1]) === true)
{
$scale[1] = $scale[0] * $size[1] / $size[0];
}
}
else
{
$scale = array($size[0], $size[1]);
}
}
else
{
$scale = array($size[0], $size[1]);
}
$result = ImageCreateTrueColor($scale[0], $scale[1]);
if (is_resource($result) === true)
{
if (ImageCopyResampled($result, $source, 0, 0, $crop[0] / 2, $crop[1] / 2, $scale[0], $scale[1], $size[0], $size[1]) === true)
{
return ImageJPEG($result, $destination, 90);
}
}
}
return false;
}