当我使用Imagick
运算符克隆clone
对象时,哪一个是昂贵的操作,clone
或后续写入克隆?
$image = new Imagick();
$image->readImage('some_big_image.jpg');
$new_image = clone $image; // is this an expensive operation?
答案 0 :(得分:1)
是的,Imagick对象上的clone方法确实可以正常工作,而不仅仅是增加内部引用计数器。
特别是它在底层的ImageMagick库中调用CloneMagickWand
。这会复制'图像' - 但是ImageMagick并不总是保留内存中图像的所有像素。所以它的确做多少工作并不明显,可能取决于你如何配置ImageMagick。
后续写入的费用取决于所使用的功能。在保存图像之前,为图像设置新格式并不是很多。模糊图像可以(显然)做很多工作。
答案 1 :(得分:1)
在Windows 7上使用ImageMagick 6.8.9构建的Imagick 3.3.0RC2进行的一些测试给出了以下结果:
$image = new Imagick();
$image->setResolution(1000,1000);
// This is a vector image, to make sure it's not just memory-mapped or something like that
$image->readImageBlob(file_get_contents(__DIR__.'/test.eps'));
$new_image = clone $image; // 0.012 s
$new_image->floodFillPaintImage('black', 0, 'white', 0, 0, false); // 0.179 s
$image->floodFillPaintImage('black', 0, 'white', 0, 0, false); // 0.126 s
(我在循环中运行,给定的持续时间是平均值。)
从这些数字来看,与后续写作相比,clone
似乎非常便宜。