Preserving the AstroImage Wrapper

Wherever possible, overloads have been added to DimensionalData and AstroImages so that common operations retain the AstroImage wrapper with associated dimensions, FITS header, and WCS information. Most of the time this works automatically if libraries follow good patterns like allocating outputs using Base.similar. However, some other library functions may follow patterns like allocating a plain Array of the correct size and then filling it.

To make it easier to work with these libraries, AstroImages exports two functions copyheader and shareheader. These functions wrap an AbstractArray in an AstroImage while copying over the header, dimensions, and WCS info.

Consider the function:

function badfunc(arr)
    out = zeros(size(arr)) # instead of similar(arr)
    out .= arr.^2
    return out
end

Calling badfunc(astroimg) will return a plain Array .

We can use copyheader to retain the AstroImage wrapper:

copyheader(astroimg, badfunc(astroimg))

For particularly incompatible functions that require an Array (not subtype of AbstractArray) we can go one step further:

copyheader(astroimg, worsefunc(parent(astroimg)))
# Or:
copyheader(astroimg, worsefunc(collect(astroimg)))