Packages
image
0.36.1
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/warp_perspective.ex
defmodule Image.Options.WarpPerspective do
@moduledoc """
Options and option validation for `Image.warp_perspective/4`.
"""
alias Vix.Vips.Image, as: Vimage
alias Image.Color
@typedoc """
Options for Image.warp_perspective/4.
"""
@type t :: [warp_perspective_option()]
@typedoc """
Options applicable to `Image.embed/4`.
"""
@type warp_perspective_option :: [
{:background, Color.t() | :average}
| {:extend_mode, extend_mode()}
]
@typedoc """
When extending the canvas the generated
pixels are determined by this option.
"""
@type extend_mode :: [
:black
| :white
| :copy
| :repeat
| :mirror
| :background
]
@doc """
Validate the options for `Image.warp_perspective/4`.
"""
@spec validate_options(Vimage.t(), Keyword.t()) ::
{:ok, Keyword.t()} | {:error, Image.error_message()}
def validate_options(image, options) when is_list(options) do
options = Keyword.merge(default_options(), options)
case Enum.reduce_while(options, options, &validate_option(&1, image, &2)) do
{:error, value} ->
{:error, value}
options ->
{:ok, options}
end
end
defp validate_option({:background, :average}, image, options) do
case Image.average(image) do
color when is_list(color) ->
options = Keyword.put(options, :background, color)
{:cont, options}
{:error, reason} ->
{:halt, {:error, "Could not get the image average: #{inspect(reason)}"}}
end
end
defp validate_option({:background, color} = option, _image, options) do
case Color.rgb_color(color) do
{:ok, hex: _hex, rgb: color} -> {:cont, Keyword.put(options, :background, color)}
{:ok, color} -> {:cont, Keyword.put(options, :backgrouond, color)}
_other -> {:halt, invalid_option(option)}
end
end
defp validate_option({:extend_mode, extend}, _image, options) do
case Image.ExtendMode.validate_extend(extend) do
{:ok, extend_mode} ->
options = Keyword.put(options, :extend_mode, extend_mode)
{:cont, options}
{:error, reason} ->
{:halt, {:error, reason}}
end
end
defp validate_option(option, _image, _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
[
extend_mode: :black,
background: :black
]
end
end