Packages
image
0.35.0
0.72.0
0.71.0
0.70.0
0.69.0
0.68.0
0.67.0
0.67.0-dev
retired
0.66.0
0.65.0
0.64.0
0.63.0
0.62.1
0.62.0
0.61.1
0.61.0
0.60.0
0.59.3
0.59.2
0.59.1
0.59.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.2
0.55.1
retired
0.55.0
0.54.4
0.54.3
0.54.2
0.54.1
0.54.0
0.53.0
0.52.3
0.52.2
0.52.1
0.52.0
retired
0.51.0
0.50.0
0.49.0
0.48.1
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.2
0.43.1
0.43.0
0.42.0
0.41.0
0.40.0
0.39.3
0.39.2
0.39.1
0.39.0
0.38.4
0.38.3
0.38.2
0.38.1
0.38.0
0.37.0
0.36.2
0.36.1
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.1
0.31.0
0.30.0
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.0
retired
0.19.0
0.18.1
0.18.0
0.17.0
0.16.0
0.15.0
0.14.4
0.14.2
0.14.1
0.14.0
retired
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.10.0-rc.0
retired
0.9.0
retired
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
An approachable image processing library primarily based upon Vix and libvips that is NIF-based, fast, multi-threaded, pipelined and has a low memory footprint.
Current section
Files
Jump to
Current section
Files
lib/image/enum/band_format.ex
defmodule Image.BandFormat do
@moduledoc """
Functions to define and validate the band
formats of an image.
"""
alias Vix.Vips.Image, as: Vimage
@type t ::
{:u, 8}
| {:s, 8}
| {:u, 16}
| {:s, 16}
| {:u, 32}
| {:s, 32}
| {:u, 64}
| {:s, 64}
| {:f, 32}
| {:f, 64}
@long_format_map %{
{:u, 8} => :VIPS_FORMAT_UCHAR,
{:s, 8} => :VIPS_FORMAT_CHAR,
{:u, 16} => :VIPS_FORMAT_USHORT,
{:s, 16} => :VIPS_FORMAT_SHORT,
{:u, 32} => :VIPS_FORMAT_UINT,
{:s, 32} => :VIPS_FORMAT_INT,
{:u, 64} => :VIPS_FORMAT_UINT,
{:s, 64} => :VIPS_FORMAT_UINT,
{:f, 32} => :VIPS_FORMAT_FLOAT,
{:f, 64} => :VIPS_FORMAT_DOUBLE
}
@short_format_map @long_format_map
|> Enum.map(fn {{sign, size}, enum} ->
{String.to_atom(to_string(sign) <> to_string(size)), enum}
end)
|> Map.new()
@band_format_map Map.merge(@long_format_map, @short_format_map)
@inverse_band_format_map @long_format_map
|> Enum.map(fn {code, enum} -> {enum, code} end)
|> Map.new()
defp band_format_map do
@band_format_map
end
defp inverse_band_format_map do
@inverse_band_format_map
end
@known_band_formats Map.keys(@long_format_map)
@vips_band_formats Map.values(@long_format_map)
@doc """
Returns a list of the known band formats.
"""
def known_band_formats do
@known_band_formats
end
@doc """
Validates a band format returning the band
format value required in the underlying
`Vix` code.
### Arguments
* `format` is any format returned by
`Image.BandFormat.known_band_formats/0`.
### Returns
* `{:ok, validated_foramt}` or
* `{:error, reason}`
### Examples
iex> Image.BandFormat.validate({:u, 8})
{:ok, :VIPS_FORMAT_UCHAR}
iex> Image.BandFormat.validate(:u8)
{:ok, :VIPS_FORMAT_UCHAR}
iex> Image.BandFormat.validate(:VIPS_FORMAT_UCHAR)
{:ok, :VIPS_FORMAT_UCHAR}
"""
def validate(format) when format in @vips_band_formats do
{:ok, format}
end
def validate(format) do
case Map.get(band_format_map(), format) do
nil ->
{:error, "Invalid band format. Found #{inspect(format)}"}
format ->
{:ok, format}
end
end
if Code.ensure_loaded?(Nx) do
def image_format_from_nx(%Nx.Tensor{} = tensor) do
tensor
|> Nx.type()
|> image_format_from_nx()
end
end
@dialyzer {:nowarn_function, {:nx_format, 1}}
@doc """
Returns the `Image` format type for an
`Nx` format type.
`Image` uses the same type formats as `Nx` so
this function is more a validation than a
conversion.
### Arguments
* Any `Nx` type like `{:u, 8}`.
### Returns
* `{:ok, band_format}` or
* `{:error, reason}`
"""
def image_format_from_nx(nx_type) do
validate(nx_type)
end
@doc """
Returns the `Nx` format type for an
`Image` or image format type.
`Image` uses the same type formats as `Nx` so
this function is more a validation than a
conversion.
### Arguments
* Any `t:Vimage.t/0` of format in the list
returned by `Image.BandFormat.known_band_formats/0`.
### Returns
* `{:ok, band_format}` or
* `{:error, reason}`
"""
def nx_format(%Vimage{} = image) do
nx_format(Vix.Vips.Image.format(image))
end
def nx_format(format) when is_atom(format) do
case Map.get(inverse_band_format_map(), format) do
nil ->
{:error, "Invalid band format. Found #{inspect(format)}"}
format ->
{:ok, format}
end
end
@doc """
Returns the `Nx` format type for an
`Image` or image format type or raises
an exception.
`Image` uses the same type formats as `Nx` so
this function is more a validation than a
conversion.
### Arguments
* Any `t:Vimage.t/0` of format in the list
returned by `Image.BandFormat.known_band_formats/0`.
### Returns
* `band_format` or
* raises an exception.
"""
def nx_format!(image_or_format) do
case nx_format(image_or_format) do
{:ok, format} -> format
{:error, reason} -> raise Image.Error, reason
end
end
end