#rgb #convert #yuv #color

ezk-image

Convert pixel and color formats such and RGB, YUV (YCbCr), ICtCp

10 releases

0.2.4 Nov 27, 2024
0.2.3 Nov 18, 2024
0.1.4 Sep 27, 2024
0.1.0 May 14, 2024

#337 in Images

Download history 165/week @ 2025-01-19 252/week @ 2025-01-26 286/week @ 2025-02-02 366/week @ 2025-02-09 425/week @ 2025-02-16 338/week @ 2025-02-23 330/week @ 2025-03-02 190/week @ 2025-03-09 112/week @ 2025-03-16 333/week @ 2025-03-23 365/week @ 2025-03-30 685/week @ 2025-04-06 290/week @ 2025-04-13 160/week @ 2025-04-20 167/week @ 2025-04-27 420/week @ 2025-05-04

1,050 downloads per month
Used in opentalk-compositor

MIT license

230KB
6K SLoC

EZK Image

ezk-image is a crate to perform conversion between common pixel formats and color spaces.

It uses SIMD and multi threading to accelerate the conversion when available, though multi-threading must be explicitly called with convert_multi_thread.

Any format can be converted to any other format.


Supported Pixel formats

Bit depth of up to 16 bit per component is supported.

  • I420
  • I422
  • I444
  • I010, I012
  • I210, I212
  • I410, I412
  • NV12
  • YUYV
  • RGBA, BGRA
  • RGB, BGR

Supported Color Primaries (color gamut)

  • SMTPE ST 240
  • BT.709 (SDR)
  • BT.2020 (HDR)

Supported Color Transfer Functions (opto-electronic transfer characteristics of samples)

  • Linear
  • Gamma of 2.2 and 2.8
  • SRGB
  • SDR (BT.601, BT.709 and BT.2020)
  • BT.2100 perceptual quantization (PQ)
  • BT.2100 hybrid log-gamma (HLG)

Supported Color Spaces

  • RGB
  • YUV BT.601
  • YUV BT.709
  • YUV BT.2020
  • ICtCp with perceptual quantization (PQ)
  • ICtCp with hybrid log-gamma (HLG)

Example

use ezk_image::*;

let (width, height) = (1920, 1080);

// Our source image, an RGB buffer
let rgb_image = vec![0u8; PixelFormat::RGB.buffer_size(width, height)];

// Create the image we're converting from
let source = Image::from_buffer(
    PixelFormat::RGB,
    &rgb_image[..], // RGB only has one plane
    None, // No need to define strides if there's no padding between rows
    width,
    height,
    ColorInfo::RGB(RgbColorInfo {
        transfer: ColorTransfer::Linear,
        primaries: ColorPrimaries::BT709,
    }),
).unwrap();

// Create the image buffer we're converting to
let mut destination = Image::blank(
    PixelFormat::NV12, // We're converting to NV12
    width,
    height,
    ColorInfo::YUV(YuvColorInfo {
        space: ColorSpace::BT709,
        transfer: ColorTransfer::Linear,
        primaries: ColorPrimaries::BT709,
        full_range: false,
    }),
);

// Now convert the image data
convert_multi_thread(
    &source,
    &mut destination,
).unwrap();

Dependencies

~0.2–1.2MB
~27K SLoC