Packages
image
0.6.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/open.ex
defmodule Image.Options.Open do
@moduledoc """
Options and option validation for `Image.open/2`.
"""
# Map the keyword option to the
# Vix option.
@typedoc """
The options applicable to opening an
image.
"""
@type image_open_options ::
jpeg_open_options()
| png_open_options()
| tiff_open_options()
| webp_open_options()
| other_open_options()
@type jpeg_open_options :: [
{:shrink, 1..16},
{:autorotate, boolean()},
{:access, file_access()},
{:fail_on, fail_on()}
]
@type png_open_options :: [
{:access, file_access()},
{:fail_on, fail_on()}
]
@type tiff_open_options :: [
{:autorotate, boolean()},
{:access, file_access()},
{:fail_on, fail_on()},
{:pages, pos_integer()},
{:page, 1..100_000}
]
@type webp_open_options :: [
{:autorotate, boolean()},
{:access, file_access()},
{:fail_on, fail_on()},
{:pages, pos_integer()},
{:page, 1..100_000},
{:scale, 1..1024}
]
@type other_open_options :: [
{:access, file_access()},
{:fail_on, fail_on()}
]
@typedoc """
The file access mode when opening
image files. The default in `:sequential`.
"""
@type file_access :: :sequential | :random
@typedoc """
Stop attempting to load an image file
when a level of error is detected.
The default is `:none`.
Each error state implies all the states
before it such that `:error` implies
also `:truncated`.
"""
@type fail_on :: :none | :truncated | :error | :warning
@fail_on_open %{
none: :VIPS_FAIL_ON_NONE,
truncated: :VIPS_FAIL_ON_TRUNCATED,
error: :VIPS_FAIL_ON_ERROR,
warning: :VIPS_FAIL_ON_WARNING
}
@failure_modes Map.keys(@fail_on_open)
@default_access :sequential
@access [:sequential, :random]
def validate_options(options) do
case Enum.reduce_while(options, options, &validate_option(&1, &2)) do
{:error, value} ->
{:error, value}
options ->
options = Keyword.put_new(options, :access, @default_access)
{:ok, options}
end
end
def validate_option({:autorotate, rotate}, options) when rotate in [true, false] do
{:cont, options}
end
def validate_option({:page, n}, options) when is_integer(n) and n in 0..100_000 do
{:cont, options}
end
def validate_option({:access, access}, options) when access in @access do
{:cont, options}
end
def validate_option({:shrink, shrink}, options) when is_integer(shrink) and shrink in 1..16 do
{:cont, options}
end
def validate_option({:scale, scale}, options) when is_integer(scale) and scale in 1..1024 do
{:cont, options}
end
def validate_option({:pages, n}, options) when is_integer(n) and n in 1..100_000 do
options =
options
|> Keyword.delete(:pages)
|> Keyword.put(:n, n)
{:cont, options}
end
def validate_option({:fail_on, failure}, options) when failure in @failure_modes do
failure = Map.fetch!(@fail_on_open, failure)
options =
options
|> Keyword.delete(:fail_on)
|> Keyword.put(:"fail-on", failure)
{:cont, options}
end
def validate_option(option, _options) do
{:halt, {:error, invalid_option(option)}}
end
defp invalid_option(option) do
"Invalid option or option value: #{inspect(option)}"
end
end