Packages
image
0.4.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/write.ex
defmodule Image.Options.Write do
@moduledoc """
Options and option validation for `Image.write/3`.
"""
# Map the keyword option to the
# Vix option.
alias Image.Color
import Color, only: [is_inbuilt_profile: 1, is_color: 1]
@typedoc """
Options for writing an image to a file with
`Image.write/2`.
"""
@type image_write_options :: [
{:suffix, String.t()}
| jpeg_write_options()
| png_write_options()
| tiff_write_options()
| webp_write_options()
]
@type jpeg_write_options :: [
{:quality, 1..100},
{:strip_metadata, boolean()},
{:icc_profile, Path.t()},
{:background, Image.pixel()}
]
@type png_write_options :: [
{:quality, 1..100},
{:strip_metadata, boolean()},
{:icc_profile, Path.t()},
{:background, Image.pixel()}
]
@type tiff_write_options :: [
{:quality, 1..100},
{:icc_profile, Path.t()},
{:background, Image.pixel()}
]
@type heif_write_options :: [
{:quality, 1..100},
{:background, Image.pixel()},
{:compression, compression()}
]
@type webp_write_options :: [
{:quality, 1..100},
{:icc_profile, Path.t()},
{:background, Image.pixel()},
{:strip_metadata, boolean()}
]
@typedoc """
Allowble compression types for heif images.
"""
@type compression :: :hevc | :avc | :jpeg | :av1
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_options(options, :require_suffix) do
with {:ok, options} <- validate_options(options) do
if Keyword.get(options, :suffix) do
{:ok, options}
else
{:error, "The option :suffix must be provided. Example: suffix: \".jpg\""}
end
end
end
defp validate_option({:suffix, "." <> _suffix}, options) do
{:cont, options}
end
defp validate_option({:quality, quality}, options)
when is_integer(quality) and quality in 1..100 do
options =
options
|> Keyword.delete(:quality)
|> Keyword.put(:Q, quality)
{:cont, options}
end
defp validate_option({:buffer_size, buffer_size}, options)
when (is_integer(buffer_size) and buffer_size >= 9) or buffer_size == :unbuffered do
{:cont, options}
end
defp validate_option({:strip_metadata, strip?}, options) when is_boolean(strip?) do
options =
options
|> Keyword.delete(:strip_metadata)
|> Keyword.put(:strip, strip?)
{:cont, options}
end
defp validate_option({:progressive, progressive?}, options) when is_boolean(progressive?) do
options =
options
|> Keyword.delete(:progressive)
|> Keyword.put(:interlace, progressive?)
{:cont, options}
end
defp validate_option({:icc_profile, profile}, options)
when is_inbuilt_profile(profile) or is_binary(profile) do
options =
options
|> Keyword.delete(:icc_profile)
|> Keyword.put(:profile, to_string(profile))
if Color.known_icc_profile?(profile) do
{:cont, options}
else
{:halt, {:error, "The color profile #{inspect(profile)} is not known"}}
end
end
defp validate_option({:background, background}, options) when is_color(background) 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
end