Packages
image
0.59.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/options/new.ex
defmodule Image.Options.New do
@moduledoc """
Options for new images.
"""
alias Image.{Color, BandFormat, Interpretation}
@type t :: [
{:bands, pos_integer()}
| {:format, Image.BandFormat.t()}
| {:interpretation, Image.Interpretation.t()}
| {:color, float() | Image.pixel()}
| {:x_res, number()}
| {:y_res, number()}
| {:x_offset, number()}
| {:y_offset, number()}
]
@default_bands 3
def default_options do
[
format: {:u, 8},
interpretation: :srgb,
color: 0,
x_res: 0,
y_res: 0,
x_offset: 0,
y_offset: 0
]
end
@doc """
Validate the options for `Image.new/2`.
"""
def validate_options(options) do
options = Keyword.merge(default_options(), options)
options =
case Enum.reduce_while(options, options, &validate_option(&1, &2)) do
{:error, value} ->
{:error, value}
options ->
{:ok, options}
end
case options do
{:ok, options} ->
options
|> Map.new()
|> set_default_bands()
|> wrap(:ok)
other ->
other
end
end
defp validate_option({:format, format}, options) when is_tuple(format) do
case BandFormat.image_format_from_nx(format) do
{:ok, format} ->
{:cont, Keyword.put(options, :format, format)}
{:error, reason} ->
{:halt, {:error, reason}}
end
end
defp validate_option({:format, format}, options) when is_atom(format) do
case BandFormat.nx_format(format) do
{:ok, _nx_type} ->
{:cont, options}
{:error, reason} ->
{:halt, {:error, reason}}
end
end
defp validate_option({:interpretation, interpretation}, options) do
case Interpretation.validate_interpretation(interpretation) do
{:ok, interpretation} ->
{:cont, Keyword.put(options, :interpretation, interpretation)}
{:error, reason} ->
{:halt, {:error, reason}}
end
end
@numeric_options [:x_res, :y_res, :x_offset, :y_offset, :bands]
defp validate_option({option, value}, options)
when option in @numeric_options and is_number(value) and value >= 0 do
{:cont, options}
end
defp validate_option({:color, color}, options) do
case Color.rgb_color(color) do
{:ok, color} ->
rgb = if Keyword.keyword?(color), do: Keyword.fetch!(color, :rgb), else: color
{:cont, Keyword.put(options, :color, rgb)}
{:error, reason} ->
{:halt, {:error, reason}}
end
end
defp validate_option({option, value}, _options) do
{:halt, {:error, invalid_option(option, value)}}
end
def set_default_bands(%{bands: _bands} = options) do
options
end
def set_default_bands(%{color: color} = options) when is_integer(color) do
Map.put(options, :bands, @default_bands)
end
def set_default_bands(%{color: color} = options) when is_list(color) do
Map.put(options, :bands, length(color))
end
@doc false
def invalid_option(option) do
"Invalid option or option value: #{inspect(option)}"
end
@doc false
def invalid_option(option, value) do
"Invalid option or option value: #{option}: #{inspect(value)}"
end
defp wrap(term, atom) do
{atom, term}
end
end