Image 在Julia中读取图像信息而不加载图像

Image 在Julia中读取图像信息而不加载图像,image,shell,imagemagick,julia,Image,Shell,Imagemagick,Julia,我正在编写一个程序来处理Julia中的一系列图像,比如ImageMagick,但有些东西是-evaluate sequence无法完成的。在花时间加载图像之前,我想做一个快速检查,以确保它们的大小、颜色深度和颜色空间都相同。我可以从ImageMagic中获得如下文件的信息: identify -ping -format "%[G] %[depth] %[colorspace]" IMAGENAME.PNG (或.JPG或IM将阅读的任何其他内容) 计划A是使用ImageMagick.jl库,但

我正在编写一个程序来处理Julia中的一系列图像,比如ImageMagick,但有些东西是
-evaluate sequence
无法完成的。在花时间加载图像之前,我想做一个快速检查,以确保它们的大小、颜色深度和颜色空间都相同。我可以从ImageMagic中获得如下文件的信息:

identify -ping -format "%[G] %[depth] %[colorspace]" IMAGENAME.PNG
(或.JPG或IM将阅读的任何其他内容)

计划A是使用ImageMagick.jl库,但在浏览源代码后,MagickWand似乎总是首先加载图像

有没有一种方法可以使用ImageMagick.jl(或其他Julia库)在不加载文件的情况下获取信息?如果不是

B计划是发起一系列的呼叫来识别并自己处理结果。我可以验证IM是否存在并正在加载,因为这样可以:

readstring(`identify --version`)
但是:

返回一个字符串,该字符串被复制并粘贴到命令行上,可以正常工作。但当我尝试使用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:?
错误:无法生成`“标识-ping-格式”%[colorspace]][depth][G]'IMG_1382.JPG`:没有这样的文件或目录(enoint)
在位于./Process.jl:321的jl_spawn(::String,::数组{String,1},::Ptr{Void},::Base.Process,::Base.DevNullStream,::Base.PipeEndpoint,::Base.TTY)中
在#424 at./process.jl:478[内联]
在setup_stdio(::Base.##424#425{Cmd,Ptr{Void},Base.Process},::Tuple{Base.DevNullStream,Pipe,Base.TTY})中的./Process.jl:466
在#spawn#423(::Nullable{Base.ProcessChain},::Function,::Cmd,::Tuple{Base.DevNullStream,Pipe,Base.TTY},::Bool,::Bool)at./process.jl:477
在(::Base.#kw##spawn)(::数组{Any,1},::Base.#spawn,::Cmd,::Tuple{Base.DevNullStream,Pipe,Base.TTY},::Bool,::Bool)at./:0
在./process.jl:539处打开(::Cmd,::String,::Base.DevNullStream)
在./process.jl:574处读取(::Cmd,::Base.DevNullStream)
在./process.jl:581[内联]处读取字符串(重复2次)
在/Applications/JuliaPro-0.5.1.1.app/Contents/Resources/julia/Contents/Resources/julia/lib/julia/sys.dylib:?
是什么导致了问题

C计划是自己对文件进行低级读取,但我真的真的不想这样做。

A计划 您完全可以直接使用ImageMagick库;您只需自己使用
魔杖
并调用未导出的
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 这是失败的,因为。拼接到
`cmd`
对象中的每个字符串都是命令的原子部分。这需要一点习惯,但完全不用担心引用。因此,与其将其构建为字符串,不如直接将其构建为命令。这样做意味着即使文件名中有空格和特殊的shell字符,命令也将始终“正常工作”

julia> readstring(`identify -ping -format '%[colorspace] %[depth] %[G]' $filename`)
"sRGB 8 1873x1630"
当然,直接使用库要好得多,因为您不需要进行字符串处理

计划A 您完全可以直接使用ImageMagick库;您只需自己使用
魔杖
并调用未导出的
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 这是失败的,因为。拼接到
`cmd`
对象中的每个字符串都是命令的原子部分。这需要一点习惯,但完全不用担心引用。因此,与其将其构建为字符串,不如直接将其构建为命令。这样做意味着即使文件名中有空格和特殊的shell字符,命令也将始终“正常工作”

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

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

对于计划“A”,使用
pingimage
方法读取图像信息而不加载图像数据。对于计划“B”,请确保Julia加载shell环境,其中
PATH
知道ImageMagick实用程序的位置。我知道找到IM是因为我首先执行
readstring(`Identification--version`)
(编辑问题以反映此情况),然后成功完成。我希望能够至少为PNG、JPG和TIFF做到这一点,而无需为每个文件加载单独的库。对于“a”计划,请使用
pingimage
方法读取图像信息,而无需加载图像数据。对于计划“B”,请确保Julia加载shell环境,其中
PATH
知道ImageMagick实用程序的位置。我知道找到IM是因为我首先执行
readstring(`Identification--version`)
(编辑问题以反映此情况),然后成功完成。我希望能够做到这一点,为PNG,JPG,和TIFF在最低限度不加载单独的库为每一个。