Packages
image
0.52.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.
Retired package: Deprecated - deprecated
Current section
Files
Jump to
Current section
Files
lib/image/options/chroma_key.ex
defmodule Image.Options.ChromaKey do
@moduledoc """
Options and option validation for `Image.chroma_key/2`.
"""
alias Image.Color
@typedoc """
Options applicable to Image.chroma_key/2
"""
@type chroma_key_options ::
[
{:color, Color.t() | :auto}
| {:threshold, non_neg_integer()}
| {:greater_than, Color.t()}
| {:less_than, Color.t()}
| {:sigma, float()}
| {:min_amplitude, float()}
]
| map()
@doc """
Validate the options for `Image.chroma_key/2`.
"""
def validate_options(options) when is_list(options) do
options = Keyword.merge(default_options(), options)
case Enum.reduce_while(options, options, &validate_option(&1, &2)) do
{:error, value} ->
{:error, value}
options ->
select_strategy(Map.new(options))
end
end
def validate_options(%{} = options) do
{:ok, options}
end
defp validate_option({:color, :auto}, options) do
{:cont, options}
end
defp validate_option({key, color} = option, options)
when key in [:greater_than, :less_than, :color] do
case Color.rgb_color(color) do
{:ok, hex: _hex, rgb: color} -> {:cont, Keyword.put(options, key, color)}
{:ok, color} -> {:cont, Keyword.put(options, key, color)}
_other -> {:halt, invalid_option(option)}
end
end
defp validate_option({:threshold, threshold}, options)
when is_integer(threshold) and threshold >= 0 do
{:cont, options}
end
defp validate_option({:sigma, sigma}, options) when is_number(sigma) and sigma > 0 do
{:cont, options}
end
defp validate_option({:min_amplitude, min_amplitude}, options) when is_float(min_amplitude) do
{:cont, Keyword.put(options, :min_amplitude, min_amplitude)}
end
defp validate_option(option, _options) do
{:halt, {:error, invalid_option(option)}}
end
defp invalid_option(option) do
"Invalid option or option value: #{inspect(option)}"
end
defp select_strategy(%{greater_than: _, less_than: _} = options) do
options =
options
|> Map.delete(:color)
|> Map.delete(:threshold)
{:ok, options}
end
defp select_strategy(%{color: _, threshold: _} = options) do
options =
options
|> Map.delete(:greater_than)
|> Map.delete(:less_than)
{:ok, options}
end
defp select_strategy(options) do
{
:error,
"Invalid options #{inspect(options)}. Options need to have either :greater_than " <>
" and :less_than or :color and :threshold."
}
end
defp default_options do
[
color: :auto,
threshold: 20
]
end
end