ImageIO.jl icon indicating copy to clipboard operation
ImageIO.jl copied to clipboard

Display bug for non-concrete eltype

Open LilithHafner opened this issue 3 years ago • 3 comments

save("test.png", repeat([x ? RGB(.2,.2,.2) : RGB(0,0,0) for x in Bool[
    0 1 1 0 0 0
    1 0 1 0 0 1
    1 1 1 0 0 0
]], inner=(3,3)))

Produces this: test

With inner=(50,50) it produces this: test

Note that the matrix being displayed has a non-homogonous elements

repeat([x ? RGB(.2,.2,.2) : RGB(0,0,0) for x in Bool[
    0 1 1 0 0 0
    1 0 1 0 0 1
    1 1 1 0 0 0
]], inner=(3,3))
9×18 Array{RGB,2} with eltype RGB:
 RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     …  RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)
 RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)        RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)
 RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)        RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)
 RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)     RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)
 RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)     RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)
 RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  …  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)
 RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)
 RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)
 RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)  RGB{Float64}(0.2,0.2,0.2)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)     RGB{N0f8}(0.0,0.0,0.0)

LilithHafner avatar Dec 15 '22 04:12 LilithHafner

I can't replicate this:

using FileIO, ImageIO, Colors
 save("test.png", repeat([x ? RGB(.2,.2,.2) : RGB(0,0,0) for x in Bool[
           0 1 1 0 0 0
           1 0 1 0 0 1
           1 1 1 0 0 0
       ]], inner=(3,3)))

test

repeat([x ? RGB(.2,.2,.2) : RGB(0,0,0) for x in Bool[
           0 1 1 0 0 0
           1 0 1 0 0 1
           1 1 1 0 0 0
       ]], inner=(50,50)) |> save("test.png")

test

asinghvi17 avatar Jul 20 '24 05:07 asinghvi17

This example now throws for me:

(jl_PKeY4u) pkg> st
Status `/tmp/jl_PKeY4u/Project.toml`
  [5ae59095] Colors v0.12.11
  [5789e2e9] FileIO v1.16.3
  [82e4d734] ImageIO v0.6.8

julia> versioninfo()
Julia Version 1.10.4
Commit 48d4fd48430 (2024-06-04 10:41 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (aarch64-linux-gnu)
  CPU: 8 × unknown
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-15.0.7 (ORCJIT, generic)
Threads: 1 default, 0 interactive, 1 GC (on 8 virtual cores)
Environment:
  JULIA_EDITOR = code

julia> using FileIO, ImageIO, Colors

julia> save("test.png", repeat([x ? RGB(.2,.2,.2) : RGB(0,0,0) for x in Bool[
                  0 1 1 0 0 0
                  1 0 1 0 0 1
                  1 1 1 0 0 0
              ]], inner=(3,3)))
Errors encountered while save File{DataFormat{:PNG}, String}("test.png").
All errors:
===========================================
MethodError: no method matching __get_bit_depth(::Type{Any})

Closest candidates are:
  __get_bit_depth(::Type{Bool})
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:9
  __get_bit_depth(::Type{<:AbstractFloat})
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:13
  __get_bit_depth(::Type{FixedPointNumbers.Normed{T, 16}}) where T
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:11
  ...

===========================================
ArgumentError: Package ImageMagick [6218d12a-5da1-5696-b52f-db25d2ecc6d1] is required but does not seem to be installed:
 - Run `Pkg.instantiate()` to install all recorded dependencies.

===========================================
ArgumentError: Package OpenCV [f878e3a2-a245-4720-8660-60795d644f2a] is required but does not seem to be installed:
 - Run `Pkg.instantiate()` to install all recorded dependencies.

===========================================
ArgumentError: Argument does not support conversion to png.
===========================================

Fatal error:
ERROR: MethodError: no method matching __get_bit_depth(::Type{Any})

Closest candidates are:
  __get_bit_depth(::Type{Bool})
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:9
  __get_bit_depth(::Type{<:AbstractFloat})
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:13
  __get_bit_depth(::Type{FixedPointNumbers.Normed{T, 16}}) where T
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:11
  ...

Stacktrace:
  [1] _get_bit_depth(img::Matrix{RGB})
    @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:4
  [2] _save(png_ptr::Ptr{…}, info_ptr::Ptr{…}, image::Matrix{…}; compression_level::Int64, compression_strategy::Int64, filters::Int64, file_gamma::Nothing, background::Nothing)
    @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/io.jl:420
  [3] save(fpath::String, image::Matrix{…}; compression_level::Int64, compression_strategy::Int64, filters::Int64, file_gamma::Nothing, background::Nothing)
    @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/io.jl:361
  [4] save(fpath::String, image::Matrix{RGB})
    @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/io.jl:335
  [5] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::@Kwargs{})
    @ Base ./essentials.jl:892
  [6] invokelatest(::Any, ::Any, ::Vararg{Any})
    @ Base ./essentials.jl:889
  [7] (::LazyModules.LazyFunction)(::String, ::Vararg{Any}; kwargs::@Kwargs{})
    @ LazyModules ~/.julia/packages/LazyModules/d9Be6/src/LazyModules.jl:29
  [8] (::LazyModules.LazyFunction)(::String, ::Vararg{Any})
    @ LazyModules ~/.julia/packages/LazyModules/d9Be6/src/LazyModules.jl:27
  [9] save(f::File{DataFormat{:PNG}, String}, image::Matrix{RGB}; kwargs::@Kwargs{})
    @ ImageIO ~/.julia/packages/ImageIO/eR22t/src/ImageIO.jl:70
 [10] save(f::File{DataFormat{:PNG}, String}, image::Matrix{RGB})
    @ ImageIO ~/.julia/packages/ImageIO/eR22t/src/ImageIO.jl:69
 [11] #invokelatest#2
    @ ./essentials.jl:892 [inlined]
 [12] invokelatest
    @ ./essentials.jl:889 [inlined]
 [13] action(call::Symbol, libraries::Vector{Union{…}}, file::Formatted, args::Matrix{RGB}; options::@Kwargs{})
    @ FileIO ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:219
 [14] action
    @ ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:196 [inlined]
 [15] action
    @ ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:185 [inlined]
 [16] save(file::String, args::Matrix{RGB}; options::@Kwargs{})
    @ FileIO ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:129
 [17] save(file::String, args::Matrix{RGB})
    @ FileIO ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:125
 [18] top-level scope
    @ REPL[9]:1
Stacktrace:
 [1] handle_error(e::MethodError, q::Base.PkgId, bt::Vector{Union{Ptr{Nothing}, Base.InterpreterIP}})
   @ FileIO ~/.julia/packages/FileIO/xOKyx/src/error_handling.jl:61
 [2] handle_exceptions(exceptions::Vector{Tuple{Any, Union{Base.PkgId, Module}, Vector}}, action::String)
   @ FileIO ~/.julia/packages/FileIO/xOKyx/src/error_handling.jl:56
 [3] action(call::Symbol, libraries::Vector{Union{…}}, file::Formatted, args::Matrix{RGB}; options::@Kwargs{})
   @ FileIO ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:228
 [4] action
   @ ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:196 [inlined]
 [5] action
   @ ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:185 [inlined]
 [6] save(file::String, args::Matrix{RGB}; options::@Kwargs{})
   @ FileIO ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:129
 [7] save(file::String, args::Matrix{RGB})
   @ FileIO ~/.julia/packages/FileIO/xOKyx/src/loadsave.jl:125
 [8] top-level scope
   @ REPL[9]:1
Some type information was truncated. Use `show(err)` to see complete types.

LilithHafner avatar Jul 20 '24 18:07 LilithHafner

Ah, I think I see where the problem is now. I have ImageMagick.jl installed in my environment stack, so

julia> save("test.png", repeat([x ? RGB(.2,.2,.2) : RGB(0,0,0) for x in Bool[
                  0 1 1 0 0 0
                  1 0 1 0 0 1
                  1 1 1 0 0 0
              ]], inner=(3,3)))
[ Info: Precompiling ImageMagick [6218d12a-5da1-5696-b52f-db25d2ecc6d1]

and this saves properly.

This is then probably applicable specifically to PNGFiles.jl.

Using PNGFiles.save, I get:

PNGFiles.save("test.png", repeat([x ? RGB(.2,.2,.2) : RGB(0,0,0) for x in Bool[
                  0 1 1 0 0 0
                  1 0 1 0 0 1
                  1 1 1 0 0 0
              ]], inner=(3,3)))
ERROR: MethodError: no method matching __get_bit_depth(::Type{Any})

Closest candidates are:
  __get_bit_depth(::Type{Bool})
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:9
  __get_bit_depth(::Type{<:AbstractFloat})
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:13
  __get_bit_depth(::Type{FixedPointNumbers.Normed{T, 16}}) where T
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:11
  ...

Stacktrace:
 [1] _get_bit_depth(img::Matrix{RGB})
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/utils.jl:4
 [2] _save(png_ptr::Ptr{Nothing}, info_ptr::Ptr{Nothing}, image::Matrix{RGB}; compression_level::Int64, compression_strategy::Int64, filters::Int64, file_gamma::Nothing, background::Nothing)
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/io.jl:420
 [3] save(fpath::String, image::Matrix{RGB}; compression_level::Int64, compression_strategy::Int64, filters::Int64, file_gamma::Nothing, background::Nothing)
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/io.jl:361
 [4] save(fpath::String, image::Matrix{RGB})
   @ PNGFiles ~/.julia/packages/PNGFiles/CBHvB/src/io.jl:335
 [5] top-level scope
   @ REPL[8]:1

asinghvi17 avatar Jul 21 '24 14:07 asinghvi17