Imagemagick进程永远挂在Loopbackjs上
我得到了这段代码,用Imagemagick检查图像文件是否包含蓝色像素,并对它们进行计数,然后保存结果 它工作得很好,但似乎Imagemagick的许多进程永远挂在服务器上,速度非常慢 有没有办法改进此代码并避免此问题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
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
方法的子进程实例。