Skip to content

Wrapping an array with AxisArrays breaks PNGFiles #43

@tlnagy

Description

@tlnagy

I ran into this when working with OMETIFF.jl returned AxisArray objects in IJulia, which uses PNGFiles for display:

julia> using FixedPointNumbers, Colors, PNGFiles, AxisArrays

julia> img = rand(Gray{N0f16}, 100, 100);

julia> PNGFiles.save("img.png", img); # works as expected

julia> PNGFiles.save("img2.png", AxisArray(img)); # wrapped with AxisArrays
ERROR: conversion to pointer not defined for AxisArray{Gray{N0f16}, 1, SubArray{Gray{N0f16}, 1, Matrix{Gray{N0f16}}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, Tuple{Axis{:col, Base.OneTo{Int64}}}}
Stacktrace:
  [1] error(s::String)
    @ Base ./error.jl:33
  [2] unsafe_convert(#unused#::Type{Ptr{Gray{N0f16}}}, a::AxisArray{Gray{N0f16}, 1, SubArray{Gray{N0f16}, 1, Matrix{Gray{N0f16}}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, Tuple{Axis{:col, Base.OneTo{Int64}}}})
    @ Base ./pointer.jl:67
  [3] pointer(x::AxisArray{Gray{N0f16}, 1, SubArray{Gray{N0f16}, 1, Matrix{Gray{N0f16}}, Tuple{Base.Slice{Base.OneTo{Int64}}, Int64}, true}, Tuple{Axis{:col, Base.OneTo{Int64}}}})
    @ Base ./abstractarray.jl:1116
  [4] iterate
    @ ./generator.jl:47 [inlined]
  [5] collect(itr::Base.Generator{Base.Generator{Base.OneTo{Int64}, Base.var"#193#194"{AxisArray{Gray{N0f16}, 2, Matrix{Gray{N0f16}}, Tuple{Axis{:col, Base.OneTo{Int64}}, Axis{:row, Base.OneTo{Int64}}}}}}, typeof(pointer)})
    @ Base ./array.jl:681
  [6] map
    @ ./abstractarray.jl:2323 [inlined]
  [7] _write_image(buf::AxisArray{Gray{N0f16}, 2, Matrix{Gray{N0f16}}, Tuple{Axis{:col, Base.OneTo{Int64}}, Axis{:row, Base.OneTo{Int64}}}}, png_ptr::Ptr{Nothing}, info_ptr::Ptr{Nothing})
    @ PNGFiles ~/.julia/packages/PNGFiles/dIbpb/src/io.jl:430
  [8] _save(png_ptr::Ptr{Nothing}, info_ptr::Ptr{Nothing}, image::AxisArray{Gray{N0f16}, 2, Matrix{Gray{N0f16}}, Tuple{Axis{:row, Base.OneTo{Int64}}, Axis{:col, Base.OneTo{Int64}}}}; compression_level::Int64, compression_strategy::Int64, filters::Int64, palette::Nothing)
    @ PNGFiles ~/.julia/packages/PNGFiles/dIbpb/src/io.jl:418
  [9] save(fpath::String, image::AxisArray{Gray{N0f16}, 2, Matrix{Gray{N0f16}}, Tuple{Axis{:row, Base.OneTo{Int64}}, Axis{:col, Base.OneTo{Int64}}}}; compression_level::Int64, compression_strategy::Int64, filters::Int64, palette::Nothing)
    @ PNGFiles ~/.julia/packages/PNGFiles/dIbpb/src/io.jl:298
 [10] save(fpath::String, image::AxisArray{Gray{N0f16}, 2, Matrix{Gray{N0f16}}, Tuple{Axis{:row, Base.OneTo{Int64}}, Axis{:col, Base.OneTo{Int64}}}})
    @ PNGFiles ~/.julia/packages/PNGFiles/dIbpb/src/io.jl:284
 [11] top-level scope
    @ REPL[5]:1

This breaks IJulia's display of AxisArrays:

image

Thoughts @IanButterworth @johnnychen94 ?

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions