我开发了一个图像调整大小&使用PHP GD库修剪类。我使用skibulks image trim script修剪了第一步中的图像背景,并将第二步中的图像缩放到所需的大小(保持原始比例)。
问题:在从imagecopy
函数获取新修剪的图像大小后,是否真的有必要执行第一个$this->_trimBackground()
作业,以便{{1}重新创建图像使用新的修剪尺寸(并在之后再次调整大小)? 或,是否可以将此作业与以下调整大小部分imagecopy
合并?
我还不知道其他可能的性能改进吗?欢迎提出各种表现建议!
功能1:
imagecopyresampled
功能2:
/**
* Resize image file
*
* @param string $filepath the image filepath
* @param integer $width the width to resize
* @param integer $height the height to resize
* @return (image blob|boolean status)
* @throws Asset_Model_Image_Exception
*/
private function _resizeImageByFilepathAndReturn($filepath, $width, $height) {
list($imageWidth, $imageHeight, $imageType) = getimagesize($filepath);
switch($imageType) {
case IMAGETYPE_GIF:
$gdImage = imagecreatefromgif($filepath);
break;
case IMAGETYPE_JPEG:
$gdImage = imagecreatefromjpeg($filepath);
break;
case IMAGETYPE_PNG:
$gdImage = imagecreatefrompng($filepath);
break;
default:
return false;
}
if($box = $this->_trimBackground($gdImage)) {
$gdTrimmed = imagecreatetruecolor($box['w'], $box['h']);
imagecopy($gdTrimmed, $gdImage, 0, 0, $box['l'], $box['t'], $box['w'], $box['h']);
$imageWidth = $box['w'];
$imageHeight = $box['h'];
$gdImage = $gdTrimmed;
unset($gdTrimmed);
}
if($imageWidth <= $width && $imageHeight <= $height) {
$fwidth = $imageWidth;
$fheight = $imageHeight;
} else {
$wscale = $width / $imageWidth;
$hscale = $height / $imageHeight;
$scale = min($wscale, $hscale);
$fwidth = $scale * $imageWidth;
$fheight = $scale * $imageHeight;
}
$gdThumbnail = imagecreatetruecolor($width, $height);
imagefill($gdThumbnail, 0, 0, 0x00FFFFFF);
imagecopyresampled($gdThumbnail, $gdImage, ($width - $fwidth) / 2, ($height - $fheight) / 2, 0, 0, $fwidth, $fheight, $imageWidth, $imageHeight);
ob_start();
imagejpeg($gdThumbnail, null, 90);
$image = ob_get_contents();
ob_end_clean();
imagedestroy($gdImage);
imagedestroy($gdThumbnail);
return $image;
}
答案 0 :(得分:5)
imagecopy()将$ gdImage的一部分复制到$ gdTrimmed,稍后几行用$ gdTrimmed覆盖$ gdImage。
是否真的有必要进行第一次图像复制?
这是你应该问自己的事情。
使用imagedestroy()
功能代替unset()
可能会大大提高您的效果。这是对imagedestroy()的有用评论:
重用图像变量不会清除旧数据的内存! 您必须使用imagedestroy()来清除数据。 (我不知道是否 unset()也可以。)
另请注意,内存中的图像数据是原始的,因此不要基于多少 您正在使用的内存基于压缩的原始文件大小 图像(例如jpeg或png)。