Packages
image
0.47.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/tone_map.ex
defmodule Image.Options.ToneCurve do
@moduledoc """
Options and option validation for `Image.apply_tone_curve/2`.
"""
import Image, only: :macros
@typedoc """
Options applicable to `Image.apply_tone_curve/2`.
"""
@type tone_curve_option ::
{:black_point, set_point()}
| {:white_point, set_point()}
| {:shadow_point, positive_percent()}
| {:mid_point, positive_percent()}
| {:highlight_point, positive_percent()}
| {:shadows, tone_adjustment()}
| {:mid_points, tone_adjustment()}
| {:highlights, tone_adjustment()}
@type tone_curve_options :: [tone_curve_option()] | map()
@typedoc """
Range for setting the black point and
white point. The range is 0..100 reflecting
the values of L* in the `Lab` colorspace.
"""
@type set_point :: 0..100
@typedoc """
A percent expressed as a float in the range
[0.0..1.0]
"""
@type positive_percent :: float()
@typedoc """
The adjustment range for the shadow,
midpoint and highlights.
"""
@type tone_adjustment :: -30..30
@doc """
Valid range for setting the black point and
white point.
"""
defguard is_set_point(point) when point in 0..100
@doc """
The range in which the shadows, mids and highlights
can be adjusted.
"""
defguard is_tone_adjustment(tone) when tone in -30..30
@doc """
Validate the options for `Image.apply_tone_curve/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 ->
cond do
options[:black_point] >= options[:white_point] ->
{:error, "White_point must be greater than black_point"}
options[:shadow_point] >= options[:mid_point] ->
{:error, "Mid_point must be greater than shadow_point"}
options[:mid_point] >= options[:highlight_point] ->
{:error, "Highlight_point must be greater than mid_point"}
{} ->
{:ok, Map.new(options)}
end
end
end
defp validate_option({:black_point, black_point}, options) when is_set_point(black_point) do
{:cont, options}
end
defp validate_option({:white_point, white_point}, options) when is_set_point(white_point) do
{:cont, options}
end
defp validate_option({:shadow_point, shadow_point}, options)
when is_positive_percent(shadow_point) do
{:cont, options}
end
defp validate_option({:mid_point, mid_point}, options) when is_positive_percent(mid_point) do
{:cont, options}
end
defp validate_option({:highlight_point, highlight_point}, options)
when is_positive_percent(highlight_point) do
{:cont, options}
end
defp validate_option({:shadows, shadow}, options) when is_tone_adjustment(shadow) do
{:cont, options}
end
defp validate_option({:mid_points, mid_points}, options) when is_tone_adjustment(mid_points) do
{:cont, options}
end
defp validate_option({:highlights, highlight}, options) when is_tone_adjustment(highlight) do
{:cont, options}
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
[
black_point: 0,
white_point: 100,
shadow_point: 0.2,
mid_point: 0.5,
highlight_point: 0.8,
shadows: 0,
mid_points: 0,
highlights: 0
]
end
end