Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Imagemagick进程永远挂在Loopbackjs上_Imagemagick_Loopbackjs_Child Process - Fatal编程技术网

Imagemagick进程永远挂在Loopbackjs上

Imagemagick进程永远挂在Loopbackjs上,imagemagick,loopbackjs,child-process,Imagemagick,Loopbackjs,Child Process,我得到了这段代码,用Imagemagick检查图像文件是否包含蓝色像素,并对它们进行计数,然后保存结果 它工作得很好,但似乎Imagemagick的许多进程永远挂在服务器上,速度非常慢 有没有办法改进此代码并避免此问题 module.exports = function (File) { File.observe('after save', function countPixels(ctx, next) { if (ctx.instance && !ctx

我得到了这段代码,用Imagemagick检查图像文件是否包含蓝色像素,并对它们进行计数,然后保存结果

它工作得很好,但似乎Imagemagick的许多进程永远挂在服务器上,速度非常慢

有没有办法改进此代码并避免此问题

module.exports = function (File) {
    File.observe('after save', function countPixels(ctx, next) {
        if (ctx.instance && !ctx.instance.blue_pixels) {
            var exec = require('child_process').exec;

            // Convert file to retrieve only blue pixels:
            exec('convert ' + ctx.instance.path + ' -fx "u.b>(u.g+0.2)&&u.b>(u.r+0.2)&&saturation>0.6" -format "%[fx:mean*w*h]" info:',
                    function (error, stdout, stderr) {
                        if (error !== null) {
                            return next(error);
                        } else {
                            ctx.instance.blue_pixels = stdout;
                            File.upsert(ctx.instance);
                        }
                    });
        }
        next();
    });
};

您使用的
-fx
操作符速度非常慢,尤其是对于大型图像。我尝试过用更快的方法来铸造同样的公式,这可能会对你有所帮助。因此,我制作了一个示例图像:

convert xc:red xc:lime -append \( xc:blue xc:cyan -append \) +append -resize 256x256! input.png

然后改写你的表达方式如下:

convert input.png \
  \( -clone 0 -separate -delete 0 -evaluate-sequence subtract -threshold 20% -write BG.png \) \
  \( -clone 0 -separate -delete 1 -evaluate-sequence subtract -threshold 20% -write BR.png \) \
  \( -clone 0 -colorspace hsl -separate -delete 0,2 -threshold 60% -write S.png \)            \
  -delete 0 \
  -evaluate-sequence min result.png
请注意,
-write XYZ.png
只是可以删除的调试语句

基本上,我正在为所有符合标准的像素构建一个遮罩,并将其置为白色,将所有不符合标准的像素置为黑色,最后,我运行
-evaluate sequence min
以找到每个像素的最小值,以便有效地满足所有三个条件:

  • 那蓝色比绿色多20%
  • 那蓝色比红色多20%
  • 饱和度超过60%
-separate-delete N
将图像分割为RGB通道,然后删除其中一个生成的通道,因此,如果我
-delete 1
(即绿色通道),则剩下红色和蓝色通道。以下是中间调试映像。第一种情况是蓝色超过红色20%:

那么蓝色比绿色多20%:

最后,饱和度超过60%:

然后结果是:

您需要将
-格式“%[fx:mean*w*h]”信息:
放回输出图像名称的末尾,以获取饱和蓝色像素的计数

如果我运行您的命令:

convert input.png -fx "u.b>(u.g+0.2)&&u.b>(u.r+0.2)&&saturation>0.6" result.png

今天我的大脑不太正常,所以请检查一下-我可能在什么地方有点前后颠倒的东西


作为基准,在10000x1000像素PNG上,我的代码运行时间为30秒,而与之相当的
-fx
需要将近7分钟。

您使用的
-fx
操作符速度非常慢,尤其是对于大型图像。我尝试过用更快的方法来铸造同样的公式,这可能会对你有所帮助。因此,我制作了一个示例图像:

convert xc:red xc:lime -append \( xc:blue xc:cyan -append \) +append -resize 256x256! input.png

然后改写你的表达方式如下:

convert input.png \
  \( -clone 0 -separate -delete 0 -evaluate-sequence subtract -threshold 20% -write BG.png \) \
  \( -clone 0 -separate -delete 1 -evaluate-sequence subtract -threshold 20% -write BR.png \) \
  \( -clone 0 -colorspace hsl -separate -delete 0,2 -threshold 60% -write S.png \)            \
  -delete 0 \
  -evaluate-sequence min result.png
请注意,
-write XYZ.png
只是可以删除的调试语句

基本上,我正在为所有符合标准的像素构建一个遮罩,并将其置为白色,将所有不符合标准的像素置为黑色,最后,我运行
-evaluate sequence min
以找到每个像素的最小值,以便有效地满足所有三个条件:

  • 那蓝色比绿色多20%
  • 那蓝色比红色多20%
  • 饱和度超过60%
-separate-delete N
将图像分割为RGB通道,然后删除其中一个生成的通道,因此,如果我
-delete 1
(即绿色通道),则剩下红色和蓝色通道。以下是中间调试映像。第一种情况是蓝色超过红色20%:

那么蓝色比绿色多20%:

最后,饱和度超过60%:

然后结果是:

您需要将
-格式“%[fx:mean*w*h]”信息:
放回输出图像名称的末尾,以获取饱和蓝色像素的计数

如果我运行您的命令:

convert input.png -fx "u.b>(u.g+0.2)&&u.b>(u.r+0.2)&&saturation>0.6" result.png

今天我的大脑不太正常,所以请检查一下-我可能在什么地方有点前后颠倒的东西


作为一个基准,在10000x1000像素的PNG上,我的代码运行时间为30秒,而
-fx
等效程序需要将近7分钟。

我不知道imagelagick部分。但对于节点部分,我看到您调用了关于imagemgick操作的next non

module.exports = function (File) {
    File.observe('after save', function countPixels(ctx, next) {
        if (ctx.instance && !ctx.instance.blue_pixels) {
            var exec = require('child_process').exec;

            // Convert file to retrieve only blue pixels:
            exec('convert ' + ctx.instance.path + ' -fx "u.b>(u.g+0.2)&&u.b>(u.r+0.2)&&saturation>0.6" -format "%[fx:mean*w*h]" info:',
                    function (error, stdout, stderr) {
                        if (error !== null) {
                            return next(error);
                        } else {
                            ctx.instance.blue_pixels = stdout;
                            File.upsert(ctx.instance);
                            next();
                        }
                    });
        }
        else{next();}
        //next(); //run next hook ASAP (before imagemagick returns back the result)
    });
};

我不知道是哪个部分。但对于节点部分,我看到您调用了关于imagemgick操作的next non

module.exports = function (File) {
    File.observe('after save', function countPixels(ctx, next) {
        if (ctx.instance && !ctx.instance.blue_pixels) {
            var exec = require('child_process').exec;

            // Convert file to retrieve only blue pixels:
            exec('convert ' + ctx.instance.path + ' -fx "u.b>(u.g+0.2)&&u.b>(u.r+0.2)&&saturation>0.6" -format "%[fx:mean*w*h]" info:',
                    function (error, stdout, stderr) {
                        if (error !== null) {
                            return next(error);
                        } else {
                            ctx.instance.blue_pixels = stdout;
                            File.upsert(ctx.instance);
                            next();
                        }
                    });
        }
        else{next();}
        //next(); //run next hook ASAP (before imagemagick returns back the result)
    });
};

太神了非常好,非常感谢您快速详细的回答。太棒了!非常好,非常感谢您快速而详细的回答。我在想,有没有办法确保子进程在卡住时被终止?@F3L1X79您可以在超时后终止它
exec
方法返回具有
kill
方法的子进程实例。我在想,有没有办法确保子进程被终止,以防它卡住?@F3L1X79您可以在超时后终止它
exec
方法返回具有
kill
方法的子进程实例。