所以,我有一个调整大小的脚本,保存一个gif并在我的服务器上保存这个gif的预览图像。
这是我的剧本:
public function createImageGif($gif, $x, $y, $w, $h)
{
$image = new Imagick();
$decoded = base64_decode($gif);
$image->readimageblob($decoded);
$image = $image->coalesceImages();
$image_name = uniqid(rand()).'.gif';
foreach ($image as $frame) { //gif creation
$frame->cropImage($w, $h, $x, $y);
$frame->thumbnailImage(117, 135);
$frame->setImagePage(117, 135, 0, 0);
}
$image = $image->deconstructImages();
$image->writeImages('uploads/profiles/'.$image_name, true);
//preview creation
$im = imagecreatefromstring($decoded);
if ($im !== false) {
header('Content-Type: image/gif');
$newimage = imagecreatetruecolor(117, 135);
imagecopyresampled($newimage, $im, 0, 0, $x, $y, 117, 135, $w, $h);
imagegif($newimage, 'uploads/profiles-preview/'.$image_name.'', 100);
imagedestroy($newimage);
imagedestroy($im);
}
return $image_name;
}
因此,$gif
最初是一个长字符串blob(大约2 000 000个字符)。最后,我服务器上的gif大小约为300ko。
此脚本需要20多个才能执行。我有很好的联系和良好的服务器。
如何优化此脚本?有什么想法吗?
编辑:这是我在javascript中创建数据的脚本:
var base64data;
var img = document.createElement('img');
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function() {
base64data = reader.result;
img.src = base64data;
}
答案 0 :(得分:-1)
为什么你的脚本使用blob binary64编码作为输入?有很多合理的理由要做这件事,但你确定它是必要的吗?你不能只从PHP temp的文件夹加载图像吗?
也许,你是从javascript函数上传图像,通过ajax,base-64编码图像(从画布上即时创建?)并将其作为字符串发送到POST参数中
另外,我看到您首先保存图像,然后重新打开它以将回复发送回客户端。为什么不发送刚调整大小的图像($ image变量中包含的图像)