Packages
image
0.67.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/icc_profile.ex
defmodule Image.ICCProfile do
@moduledoc """
Helpers for the ICC color profiles known to libvips.
## What "built-in" means
libvips ships with a small set of built-in colour profile *names*
(`:srgb`, `:cmyk`, `:p3`). They are loaded by libvips itself on
demand from its own profile collection — `:image` does *not* ship
any `.icc` files. The four atoms are simply the names libvips
recognises and resolves to its own internal profiles when you pass
them to a vips operation that takes a profile.
Anything else (the `t:Path.t/0` form) is treated as a path to an
`.icc` file on disk. Absolute paths are used as-is. Relative paths
are resolved against the libvips profile search path. The path is
validated by attempting to load it with
`Vix.Vips.Operation.profile_load/1`.
## API summary
* `inbuilt/0` returns the four built-in atoms.
* `is_inbuilt/1` is a `defguard` for the same set.
* `known?/1` returns `true` for any built-in *or* any loadable file
path. Use it to validate user-supplied profile arguments.
## Migration
This module is the new home for the ICC-related helpers that used
to live in `Image.Color`. The contracts are unchanged.
"""
@inbuilt [:none, :srgb, :cmyk, :p3]
@typedoc """
An ICC profile reference.
* `:none` means no profile.
* `:srgb`, `:cmyk`, and `:p3` refer to the libvips built-in
profiles.
* A path is any file system path. Relative paths are resolved
against the system profile directory.
"""
@type t :: :none | :srgb | :cmyk | :p3 | Path.t()
@doc """
Guards whether a profile is one of the built-ins.
"""
defguard is_inbuilt(profile) when profile in @inbuilt
@doc """
Returns the list of profiles built into libvips.
### Examples
iex> Image.ICCProfile.inbuilt()
[:none, :srgb, :cmyk, :p3]
"""
@spec inbuilt() :: [t()]
def inbuilt, do: @inbuilt
@doc """
Returns true if the given profile is known and usable.
Built-in atoms (`:none`, `:srgb`, `:cmyk`, `:p3`) always return
true. File paths are validated by trying to load them with
`Vix.Vips.Operation.profile_load/1`.
### Examples
iex> Image.ICCProfile.known?(:srgb)
true
iex> Image.ICCProfile.known?(:none)
true
iex> Image.ICCProfile.known?("/no/such/file.icc")
false
"""
@spec known?(t()) :: boolean()
def known?(profile) when is_inbuilt(profile), do: true
def known?(path) when is_binary(path) do
case Vix.Vips.Operation.profile_load(path) do
{:ok, _} -> true
_other -> false
end
end
def known?(_other), do: false
end