| // Copyright 2025 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| use crabby_avif::image::*; |
| use crabby_avif::reformat::rgb; |
| use crabby_avif::AvifError; |
| use crabby_avif::AvifResult; |
| |
| use super::Writer; |
| |
| use image::codecs::jpeg; |
| use std::fs::File; |
| |
| #[derive(Default)] |
| pub(crate) struct JpegWriter { |
| pub quality: Option<u8>, |
| } |
| |
| impl Writer for JpegWriter { |
| fn write_frame(&mut self, file: &mut File, image: &Image) -> AvifResult<()> { |
| let mut rgb = rgb::Image::create_from_yuv(image); |
| rgb.depth = 8; |
| rgb.format = rgb::Format::Rgb; |
| rgb.allocate()?; |
| rgb.convert_from_yuv(image)?; |
| |
| let rgba_pixels = rgb.pixels.as_ref().unwrap(); |
| let mut encoder = jpeg::JpegEncoder::new_with_quality(file, self.quality.unwrap_or(90)); |
| encoder |
| .encode( |
| rgba_pixels.slice(0, rgba_pixels.size() as u32)?, |
| image.width, |
| image.height, |
| image::ColorType::Rgb8, |
| ) |
| .or(Err(AvifError::UnknownError("Jpeg encoding failed".into())))?; |
| Ok(()) |
| } |
| } |