0

我正在尝试在 PHP 上使用 ImagickDraw 来使用非常大量(~100,000)的 circle() rectangle() 等调用来绘制图像。这些在 4 个 cmyk 通道之间拆分,因此每个通道大约有 30k 调用。

实际circle()rectangle()调用本身非常快,程序的整个部分在不到一秒的时间内运行;然后我点击了我drawImage在 4 个单独ImagickDraw对象中的每一个上使用的部分,这需要超过 15 秒才能运行每一层......明白这是一个非常复杂的图像,但有什么办法可以加快速度吗?

我考虑过使用 pthread,为 4 个ImagickDraw对象中的每一个都有一个单独的 pthread,这只是导致程序挂起:

class Render extends Thread
{
    public $im;
    private $svg;

    public function __construct($width, $height, $bg, $svg)
    {
        $this->im = new Imagick();
        $this->svg = $svg;
        $this->im->newImage($width, $height, $bg);

    }

    public function run()
    {
        $id = new ImagickDraw();
        $id->setVectorGraphics($this->svg);
        $this->im->drawImage($id);
    }
}

$threads = [];
$imarray = [];
foreach($drawar as $c=>$s){
    $threads[$c] = new Render($finalsize['width'], $finalsize['height'], 'white', $s);
    $threads[$c]->start();
}

foreach($threads as $c=>$p){
    $p->join();
    $imarray[$c] = $p->im;
    echo "Got {$c} data\n";
}

谢谢!

4

1 回答 1

1

我很惊讶 i) 工作 ii) 这么快。

我建议尝试的是忘记给 Imagick 打这么多个人电话。

而是使用适当的 svg 圆形和矩形标记手动生成 SVG XML 文档。然后使用 Imagick 将该图像合成/转换为您想要的输出图像格式。

我考虑过使用 pthread,为 4 个 ImagickDraw 对象中的每一个都有一个单独的 pthread,这只是导致程序挂起:

是的,那是行不通的。底层 C 库与 pthread 不兼容。

于 2018-12-07T03:04:29.533 回答