Skip to content

Commit

Permalink
feat(cli): added avif codec
Browse files Browse the repository at this point in the history
  • Loading branch information
SalOne22 committed Mar 16, 2024
1 parent 9658fce commit aa89db5
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 2 deletions.
27 changes: 27 additions & 0 deletions src/cli/codecs/avif.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
use clap::{arg, value_parser, Command};
use indoc::indoc;

pub fn avif() -> Command {
Command::new("avif")
.about("Encode images into AVIF format")
.args([
arg!(-q --quality <NUM> "Quality which the image will be encoded with")
.value_parser(value_parser!(u8).range(1..=100))
.default_value("50"),
arg!(--alpha_quality <NUM> "Separate alpha quality which the image will be encoded with")
.value_parser(value_parser!(u8).range(1..=100)),
arg!(--speed <NUM> "Compression speed (effort)")
.long_help(indoc! {"Compression speed (effort)
1 = very very slow, but max compression
10 = quick, but larger file sizes and lower quality."})
.value_parser(value_parser!(u8).range(1..=10))
.default_value("6"),
arg!(--colorspace <COLOR> "Set color space of AVIF being written")
.value_parser(["ycbcr", "rgb"])
.default_value("ycbcr"),
arg!(--alpha_mode <MODE> "Configure handling of color channels in transparent images")
.value_parser(["UnassociatedDirty", "UnassociatedClean", "Premultiplied"])
.default_value("UnassociatedClean")
])
}
6 changes: 4 additions & 2 deletions src/cli/codecs/mod.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
use clap::Command;

use self::{
farbfeld::farbfeld, jpeg::jpeg, jpeg_xl::jpeg_xl, mozjpeg::mozjpeg, oxipng::oxipng, png::png,
ppm::ppm, qoi::qoi,
avif::avif, farbfeld::farbfeld, jpeg::jpeg, jpeg_xl::jpeg_xl, mozjpeg::mozjpeg, oxipng::oxipng,
png::png, ppm::ppm, qoi::qoi,
};

mod avif;
mod farbfeld;
mod jpeg;
mod jpeg_xl;
Expand All @@ -17,6 +18,7 @@ mod qoi;
impl Codecs for Command {
fn codecs(self) -> Self {
self.subcommands([
avif(),
farbfeld(),
jpeg(),
jpeg_xl(),
Expand Down
25 changes: 25 additions & 0 deletions src/cli/pipeline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use std::{collections::BTreeMap, fs::read, path::Path};
use clap::ArgMatches;
use mozjpeg::qtable;
use rimage::codecs::{
avif::{AvifEncoder, AvifOptions},
mozjpeg::{MozJpegEncoder, MozJpegOptions},
oxipng::{OxiPngEncoder, OxiPngOptions},
};
Expand Down Expand Up @@ -226,6 +227,30 @@ pub fn encoder(matches: &ArgMatches) -> Result<(Box<dyn EncoderTrait>, &'static

Ok((Box::new(OxiPngEncoder::new_with_options(options)), "png"))
}
"avif" => {
let options = AvifOptions {
quality: *matches.get_one::<u8>("quality").unwrap() as f32,
alpha_quality: matches.get_one::<u8>("alpha_quality").map(|q| *q as f32),
speed: *matches.get_one::<u8>("speed").unwrap(),
color_space: match matches.get_one::<String>("colorspace").unwrap().as_str() {
"ycbcr" => ravif::ColorSpace::YCbCr,
"rgb" => ravif::ColorSpace::RGB,
_ => unreachable!(),
},
alpha_color_mode: match matches
.get_one::<String>("alpha_mode")
.unwrap()
.as_str()
{
"UnassociatedDirty" => ravif::AlphaColorMode::UnassociatedDirty,
"UnassociatedClean" => ravif::AlphaColorMode::UnassociatedClean,
"Premultiplied" => ravif::AlphaColorMode::Premultiplied,
_ => unreachable!(),
},
};

Ok((Box::new(AvifEncoder::new_with_options(options)), "avif"))
}
"png" => Ok((Box::new(PngEncoder::new()), "png")),
"ppm" => Ok((Box::new(PPMEncoder::new()), "ppm")),
"qoi" => Ok((Box::new(QoiEncoder::new()), "qoi")),
Expand Down

0 comments on commit aa89db5

Please sign in to comment.