【问题标题】:Reading image info in Julia without loading the images在 Julia 中读取图像信息而不加载图像
【发布时间】: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


【解决方案1】:

A计划

你绝对可以直接使用 ImageMagick 库;您只需要自己使用wand 并调用未导出的pingimage 方法:

julia> wand = MagickWand()
ImageMagick.MagickWand(Ptr{Void} @0x00007f92e48fac00)

julia> ImageMagick.pingimage(wand, filename)

julia> getimagecolorspace(wand), getimagedepth(wand), size(wand)
("sRGB",8,(1873,1630))

B计划

这失败了,因为command interpolation is special。您拼接到`cmd` 对象中的每个字符串都是命令的原子部分。这需要一点时间来适应,但不必担心引用绝对是美妙的。因此,不要将其构建为字符串,而是直接将其构建为命令。这样做意味着该命令将始终“正常工作”,即使文件名中有空格和特殊 shell 字符。

julia> readstring(`identify -ping -format '%[colorspace] %[depth] %[G]' $filename`)
"sRGB 8 1873x1630"

当然,直接使用库要好得多,因为您不需要进行字符串处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2017-06-11
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多