【问题标题】:Why can't one do image processing with PHP?为什么不能用 PHP 进行图像处理?
【发布时间】:2012-03-16 14:59:58
【问题描述】:

我正在对 500x500 像素的图像进行基本的逐像素处理。不管我输入什么等式,如果它没有耗尽内存,它会在很长一段时间内完成。

比较这个脚本:

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.847129106522 秒完成

还有这个:

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.651962041855s 完成

仅对嵌套迭代和额外的函数调用进行硬编码并获得9 ms。我有一个 2.4GHz 双核和 4GB 内存;事情不应该有所不同吗?如何提高 PHP 的计算能力?

【问题讨论】:

  • 您不应该将 PHP 用于此类事情。 PHP 并不是用来处理大型计算的。
  • 为什么要使用 PHP ? PHP 不是用来编程的。使用 MATLAB 或 Python 或 C++。
  • 38.84 和 29.65 毫秒?那不是很长的时间!此外,PHP 使用系统调用来做数学运算,所以我不相信你可以做任何事情来“增加”PHP 计算的能力。您可能需要增加 PHP 的内存限额,请参阅 php.ini memory_limit。
  • 您可以在 C 中为 php 编写一个模块 =) 此外,即使在 C 中展开短循环也可以将速度提高 10-20%。
  • @BenAshton 这是秒而不是毫秒,我的错。

标签: php performance image math processor


【解决方案1】:

一个人可以使用 PHP 进行图像处理 - 我经常这样做,并且符合我的要求哦,太好了。

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

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

您有很多选择,但您需要先给出一个真实的用例,然后才能有人指导您。

【讨论】:

    【解决方案2】:

    在 zaf 的回复之后,我又进行了一些挖掘,发现 PHP slow on string joining?

    我使用array('row1'=>array('col1'=> array($r,$g,$b), [...]), [...]) 来存储像素值。看起来按位运算的工作速度要快得多,我会用它们来代替。

    【讨论】:

      【解决方案3】:

      PHP 是一种高级、灵活且易于使用的语言,但您为这种易用性付出的代价是速度。为了支持这种灵活性,在幕后进行了很多工作,即使不是真正需要它,就像在您的示例中一样。

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

      【讨论】:

        【解决方案4】:

        经过 9 个小时的繁琐研究,我终于找到了 ImageMagick 的 ::fxImage 函数!使用数学进行逐像素处理。

        伙计,我感到非常解脱,我就像在冰河时代一样将西瓜砸到悬崖上。

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

        谢谢大家!

        【讨论】:

          猜你喜欢
          • 2021-02-17
          • 1970-01-01
          • 1970-01-01
          • 2015-02-22
          • 2018-05-18
          • 1970-01-01
          • 1970-01-01
          • 2011-04-18
          • 1970-01-01
          相关资源
          最近更新 更多