为什么可以';没有人用PHP做图像处理


Why can't one do image processing with PHP?

我正在对500x500px的图像进行基本的逐像素处理。不管我放了什么方程,如果它没有耗尽内存,它会在很长的时间内完成。

比较此脚本:

define('STARTED_AT',microtime(true));
set_time_limit(0);
function calculatesomething(){ return abs(100-round(pow(15/150,2)))+pow(2,4) - calculatesomething2(); }
function calculatesomething2(){ return abs(100-round(pow(15/150,2)))+pow(2,4) - calculatesomething3(); }
function calculatesomething3(){ return abs(100-round(pow(15/150,2)))+pow(2,4); }
$r = array();
foreach(range(1,pow(10,5)) as $x){
    foreach(range(1,4) as $y)
        $r[] = calculatesomething();
}
$o = (microtime(true)-STARTED_AT);
echo 'took '.$o.'ms to finish';

完成需要38.847129106522s

这个:

define('STARTED_AT',microtime(true));
set_time_limit(0);
function calculatesomething(){ return abs(100-round(pow(15/150,2)))+pow(2,4) - calculatesomething2(); }
function calculatesomething2(){ return abs(100-round(pow(15/150,2)))+pow(2,4) - calculatesomething3(); }
function calculatesomething3(){ return abs(100-round(pow(15/150,2)))+pow(2,4); }
$r = array();
foreach(range(1,pow(10,5)) as $x){
    $r[] = abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) ));
    $r[] = abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) ));
    $r[] = abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) ));
    $r[] = abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) - ( abs(100-round(pow(15/150,2)))+pow(2,4) ));
}
$o = (microtime(true)-STARTED_AT);
echo 'took '.$o.'ms to finish';

29.65196241855s完成

只对嵌套迭代和额外的函数调用进行了硬编码,获得了9ms。我有2.4GHz双核和4GB RAM;事情不应该有所不同吗?我可以做些什么来提高PHP的计算能力?

One可以用PHP进行图像处理-我经常这样做,非常适合我的要求。

这完全取决于你的空间和时间限制。

如果通过浏览器请求在服务器上用PHP进行操作并不能解决问题,那么你需要检查你的算法,然后再检查你的工具。

你有很多选择,但在有人指导你之前,你需要给出一个真实的用例。

在zaf的回应之后,我做了更多的挖掘,发现PHP字符串连接速度慢?

我使用array('row1'=>array('col1'=> array($r,$g,$b), [...]), [...])来存储像素值。看起来按位操作的速度要快得多,我会改为使用这些操作。

PHP是一种高级、灵活、易用的语言,但您为易用性付出的代价是速度。在幕后有很多事情来支持这种灵活性,即使不是真的需要,比如在你的例子中。

逐像素处理是低级别的经典任务,接近于C或C++等金属语言。如果你需要速度,你可能想研究一下用C编写PHP扩展。

经过9个小时乏味的研究,我终于找到了ImageMagick的::fxImage函数!逐像素的数学处理。

伙计,我如释重负,我会像冰河时代一样把西瓜砸到悬崖上。

http://www.imagemagick.org/script/fx.php

谢谢大家!