【发布时间】:2017-04-03 15:09:16
【问题描述】:
我正在编写一个程序来处理 Julia 中的一系列图像,例如 ImageMagick,但有一些 -evaluate-sequence 无法做到的事情。在花时间加载图像之前,我想快速检查一下以确保它们的大小、颜色深度和颜色空间都相同。我可以从 ImageMagic 获取这样一个文件的信息:
identify -ping -format "%[G] %[depth] %[colorspace]" IMAGENAME.PNG
(或 .JPG 或 IM 将读取的任何其他文件)。
方案A是使用ImageMagick.jl库,但浏览源码后,看起来MagickW总是先加载图片。
有没有办法使用 ImageMagick.jl(或其他一些 Julia 库)在不加载文件的情况下获取信息?如果不是...
B 计划是向identify 发起一系列调用并自己处理结果。我可以验证 IM 是否存在并正在加载,因为这可行:
readstring(`identify --version`)
但是:
cmd = "identify -ping -format '%[colorspace] %[depth] %[G]' MYIMAGE.JPG"
返回一个字符串,将其复制并粘贴到命令行上,就可以正常工作。但是当我在 REPL 中尝试时:
cmd = "identify -ping -format '%[colorspace] %[depth] %[G]' MYIMAGE.JPG"
readstring(`$cmd`)
这就是发生的事情:
ERROR: could not spawn `"identify -ping -format '%[colorspace] %[depth] %[G]' IMG_1382.JPG"`: no such file or directory (ENOENT)
in _jl_spawn(::String, ::Array{String,1}, ::Ptr{Void}, ::Base.Process, ::Base.DevNullStream, ::Base.PipeEndpoint, ::Base.TTY) at ./process.jl:321
in #424 at ./process.jl:478 [inlined]
in setup_stdio(::Base.##424#425{Cmd,Ptr{Void},Base.Process}, ::Tuple{Base.DevNullStream,Pipe,Base.TTY}) at ./process.jl:466
in #spawn#423(::Nullable{Base.ProcessChain}, ::Function, ::Cmd, ::Tuple{Base.DevNullStream,Pipe,Base.TTY}, ::Bool, ::Bool) at ./process.jl:477
in (::Base.#kw##spawn)(::Array{Any,1}, ::Base.#spawn, ::Cmd, ::Tuple{Base.DevNullStream,Pipe,Base.TTY}, ::Bool, ::Bool) at ./<missing>:0
in open(::Cmd, ::String, ::Base.DevNullStream) at ./process.jl:539
in read(::Cmd, ::Base.DevNullStream) at ./process.jl:574
in readstring at ./process.jl:581 [inlined] (repeats 2 times)
in readstring(::Cmd) at /Applications/JuliaPro-0.5.1.1.app/Contents/Resources/julia/Contents/Resources/julia/lib/julia/sys.dylib:?
导致问题的原因是什么?
C 计划是自己对文件进行低级读取,但我真的、真的不想这样做。
【问题讨论】:
-
对于计划'A',使用
pingimage方法读取图像信息而不加载图像数据。对于计划“B”,确保 Julia 加载 shell 环境,PATH知道 ImageMagick 实用程序的位置。 -
我知道 IM 被发现是因为我先做
readstring(`identify --version`)(编辑问题以反映这一点),并且成功完成。我希望能够至少为 PNG、JPG 和 TIFF 执行此操作,而无需为每个文件加载单独的库。
标签: image shell imagemagick julia