Packages
image
0.13.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/crop.ex
defmodule Image.Options.Crop do
@moduledoc """
Options and option validation for `Image.crop/5`.
"""
@typedoc """
Options applicable to cropping an
image.
Currently there are no options.
"""
@type crop_options :: []
@typedoc """
Indicates how to determine where to crop
an image to fill a target area.
* `:none` means the image will be reduced
to fit the required bounding box and
no cropping will occur.
* `:center` means crop from the center of
the image. The central part of the image
will be returned, cropped to fill the
bounding box.
* `:entropy` uses an entropy measure.
* `:attention` means crop the image by looking
for features likely to draw human attention.
* `:low` means position the crop towards the
low coordinate. This means the bottom part
of the image remains after the crop.
* `:high` means position the crop towards the
high coordinate. This means the top part
of the image remains after the crop.
"""
@type crop_focus :: :none | :center | :entropy | :attention | :low | :high
# The meaning of :low and :high are deliberately
# Although the verb is crop (to remove) most
# would expect this verb to describe what remains
# after cropping. Indeed that is already the behaviour for
# :center and :attention.
# Note too that we use US English spelling as apposed
# to the libvips British English spelling. The
# assumption being that most developers expect
# US English.
@crop_map %{
none: :VIPS_INTERESTING_NONE,
center: :VIPS_INTERESTING_CENTRE,
entropy: :VIPS_INTERESTING_ENTROPY,
attention: :VIPS_INTERESTING_ATTENTION,
low: :VIPS_INTERESTING_HIGH,
high: :VIPS_INTERESTING_LOW
}
@crop Map.keys(@crop_map)
def validate_options(options) do
case Enum.reduce_while(options, options, &validate_option(&1, &2)) do
{:error, value} ->
{:error, value}
options ->
{:ok, options}
end
end
def validate_option(_other, options) do
{:cont, options}
end
@doc false
def validate_crop(crop, options) when crop in @crop do
crop = Map.fetch!(@crop_map, crop)
{:cont, Keyword.put(options, :crop, crop)}
end
def validate_crop(crop, _options) do
{:halt, {:error, invalid_crop(crop)}}
end
defp invalid_crop(crop) do
"Invalid crop option #{inspect(crop)}. Valid values are #{inspect(@crop)}"
end
end