Packages
image
0.48.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/compare.ex
defmodule Image.Options.Compare do
@moduledoc """
Options and option validation for `Image.compare/3`.
"""
import Image, only: :macros
alias Image.Color
@typedoc """
Options applicable to `Image.compare/3`.
"""
@type compare_option ::
{:color, Color.t() | :auto}
| {:threshold, non_neg_integer()}
| {:greater_than, Color.t()}
| {:less_than, Color.t()}
| {:sigma, float()}
| {:min_amplitude, float()}
@type compare_options :: [compare_option()] | map()
# Ussed by Image.compare/3 and defines the
# default metric to be used.
@default_compare_metric :ae
# When overlaying the difference on the original image,
# use this color by default.
@default_difference_color :red
# Saturation for the base image when used with the
# difference overlay.
@default_saturation 1.0
# Brightness for the base image when used with the
# difference overlay.
@default_brightness 1.0
# How much to boost the colors of the difference
# pixels.
@default_boost 1.5
# The valid comparison metrics
@valid_metrics [:ae, :mse, :rmse]
@doc """
Validate the options for `Image.compare/3`.
"""
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 ->
{:ok, Map.new(options)}
end
end
defp validate_option({:metric, metric}, options) when metric in @valid_metrics do
{:cont, options}
end
defp validate_option({:saturation, saturation}, options) when is_multiplier(saturation) do
{:cont, options}
end
defp validate_option({:brightness, brightness}, options) when is_multiplier(brightness) do
{:cont, options}
end
defp validate_option({:difference_boost, difference_boost}, options)
when is_multiplier(difference_boost) do
{:cont, options}
end
defp validate_option({:difference_color, color} = option, options) do
case Color.rgb_color(color) do
{:ok, hex: _hex, rgb: color} -> {:cont, Keyword.put(options, :difference_color, color)}
{:ok, color} -> {:cont, Keyword.put(options, :difference_color, color)}
_other -> {:halt, invalid_option(option)}
end
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 default_options do
[
metric: @default_compare_metric,
difference_color: @default_difference_color,
brightness: @default_brightness,
saturation: @default_saturation,
difference_boost: @default_boost
]
end
end