我想获取python中文件的平均亮度。阅读上一个问题[之后,我想到了:
cmd='/usr/bin/convert {} -format "%[fx:100*image.mean]\n" info: > bright.txt'.format(full)
subprocess.call(cmd,shell=True)
with open('bright.txt', 'r') as myfile:
x=myfile.read().replace('\n', '')
return x
上一个问题建议使用“ pythonmagick”,我可以找到它,但没有最新文档,最近的活动很少。我无法弄清楚使用它的语法。
我知道我的代码不能令人满意,但是确实可以。 有没有不需要'shell = true'或其他文件处理的更好方法?
答案 0 :(得分:0)
您可能可以改善子流程,并使用Popen
+ PIPE
删除临时文本文件。
cmd=['/usr/bin/convert',
full,
'-format',
'%[fx:100*image.mean]',
'info:']
pid = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = pid.communicate()
return float(out)
ImageMagick还附带identify
实用程序。使用...可以实现相同的方法。
cmd=['/usr/bin/identify', '-format', '%[fx:100*image.mean]', full]
如果值得直接与ImageMagick的共享库一起使用,可能值得探讨。通常通过C-API(pythonmagick,魔杖等)连接。对于您所做的事情,这只会增加代码复杂性,增加模块依赖性,而绝不会提高性能或准确性。
答案 1 :(得分:0)
这似乎对我有用,将均值作为可以打印的变量返回。 (这是一个错误。请参阅底部的更正)
public void SomeMethod(ref int parameter)
{
parameter++;
}
结果是70.67860,这将返回到终端。
如果您解析命令的每个部分,这也适用于shell = False。
#!/opt/local/bin/python3.6
import subprocess
cmd = '/usr/local/bin/convert lena.jpg -format "%[fx:100*mean]" info:'
mean=subprocess.call(cmd, shell=True)
print (mean)
结果是70.67860,这将返回到终端。
下面#!/opt/local/bin/python3.6
import subprocess
cmd = ['/usr/local/bin/convert','lena.jpg','-format','%[fx:100*mean]','info:']
mean=subprocess.call(cmd, shell=False)
print (mean)
中的注释表明,我的上述处理方法不正确,因为平均值在终端显示,但实际上并未放入变量中。
他建议使用tripleee
。以下是他的解决方案。 (谢谢,三胞胎)
subprocess.check_output()
打印:#!/opt/local/bin/python3.6
import subprocess
filename = 'lena.jpg'
mean=subprocess.check_output(
['/usr/local/bin/convert',
filename,
'-format',
'mean=%[fx:100*mean]',
'info:'], universal_newlines=True)
print (mean)