Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Metadata #1448

Draft
wants to merge 7 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions src/color.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,100 @@ pub enum ColorType {
__NonExhaustive(crate::utils::NonExhaustiveMarker),
}

/// Color information of an image's texels.
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub enum Color {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this be more clear as ColorSpace?

/// The color space is given by an encoded ICC profile.
///
/// This is a superset of other options but the consumer must itself decode and extract the
/// values. They should indicate an error similar to a completely unsupported color space in
/// case this fails.
Icc {
/// The binary ICC data.
profile: Vec<u8>,
},
/// There is, explicitly, no known color model associated with these values.
///
/// The image might contain indices without any associated color map, or it might represent
/// quantities not related to color, or non-standard colorimetric values. Note that this is
/// different from no information being available.
Opaque,
/// A common model based on the CIE 1931 XYZ observer.
Xyz {
/// The standardized RGB primary colors.
primary: Primaries,
/// The transfer function (electro-optical, opto-electrical).
transfer: Transfer,
/// The whitepoint of the color space.
/// In general, we can not transform from one to another without loss of accuracy.
whitepoint: Whitepoint,
/// The absolute luminance of the values in the color space.
luminance: Luminance,
},
}

/// Transfer functions from encoded chromatic samples to physical quantity.
///
/// Ignoring viewing environmental effects, this describes a pair of functions that are each others
/// inverse: An electro-optical transfer (EOTF) and opto-electronic transfer function (OETF) that
/// describes how scene lighting is encoded as an electric signal. These are applied to each
/// stimulus value.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum Transfer {
/// Specified in ITU Rec.709.
Bt709,
Bt470M,
/// Specified in ITU Rec.601.
Bt601,
Smpte240,
/// Also known as the identity function.
Linear,
/// The common sRGB standard which is close to standard 'gamma correction'.
Srgb,
/// ITU Rec.2020 with 10 bit quantization.
Bt2020_10bit,
/// ITU Rec.2020 with 12 bit quantization.
Bt2020_12bit,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does Bt2020_10bit use a different transfer function than Bt2020_12bit?

Copy link
Member Author

@HeroicKatora HeroicKatora Apr 5, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not mathematically, but the quantization is different. Anyways having both of them is straightup copied from the transfer_characteristics field of AV1.

Smpte2084,
/// Specified in ITU Rec.2100.
/// The same as Smpte2084.
Bt2100Pq,
/// ITU Rec.2100 Hybrid Log-Gamma.
Bt2100Hlg,
}

/// The reference brightness of the color specification.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum Luminance {
/// 100cd/m².
Sdr,
/// 10_000cd/m².
/// Known as high-dynamic range.
Hdr,
}

/// The relative stimuli of the three corners of a triangular gamut.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum Primaries {
Bt601_525,
Bt601_625,
Bt709,
Smpte240,
Bt2020,
Bt2100,
}

/// The whitepoint/standard illuminant.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum Whitepoint {
D65,
}

impl ColorType {
/// Returns the number of bytes contained in a pixel of `ColorType` ```c```
pub fn bytes_per_pixel(self) -> u8 {
Expand Down Expand Up @@ -81,6 +175,15 @@ impl ColorType {
}
}

impl Color {
pub const SRGB: Color = Color::Xyz {
luminance: Luminance::Sdr,
primary: Primaries::Bt709,
transfer: Transfer::Srgb,
whitepoint: Whitepoint::D65,
};
}

/// An enumeration of color types encountered in image formats.
///
/// This is not exhaustive over all existing image formats but should be granular enough to allow
Expand Down
7 changes: 5 additions & 2 deletions src/io/metagram.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use std::cell::RefCell;
use std::sync::{Arc, Mutex};

use crate::color::Color;

// oder (Engram), Metagram,
HeroicKatora marked this conversation as resolved.
Show resolved Hide resolved
/// Collects some arbitrary meta data of an image.
HeroicKatora marked this conversation as resolved.
Show resolved Hide resolved
///
Expand All @@ -16,8 +18,9 @@ pub struct Metagram {
pub width: u32,
/// The original height in pixels.
pub height: u32,
/// An ICC profile characterizing color interpretation of the image input.
pub color_profile: Option<Vec<u8>>,
/// The available color information.
/// For example, an ICC profile characterizing color interpretation of the image input.
pub color_profile: Option<Color>,
/// Encoded EXIF data associated with the image.
pub exif: Option<Vec<u8>>,
_non_exhaustive: (),
Expand Down
11 changes: 8 additions & 3 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,9 @@ extern crate quickcheck;

use std::io::Write;

pub use crate::color::{ColorType, ExtendedColorType};
pub use crate::color_::{ColorType, ExtendedColorType};

pub use crate::color::{Luma, LumaA, Rgb, Rgba, Bgr, Bgra};
pub use crate::color_::{Luma, LumaA, Rgb, Rgba, Bgr, Bgra};

pub use crate::error::{ImageError, ImageResult};

Expand Down Expand Up @@ -354,11 +354,16 @@ pub mod webp {
pub use crate::codecs::webp::{vp8, WebPDecoder};
}

pub mod color {
pub(crate) use crate::color_::*;
pub use crate::color_::{Color, Luminance, Transfer, Primaries, Whitepoint};
}

mod animation;
#[path = "buffer.rs"]
mod buffer_;
mod color;
#[path = "color.rs"]
mod color_;
mod dynimage;
mod image;
mod traits;
Expand Down