Allowing to set oxipng optimization level

This commit is contained in:
Matteo Paonessa 2024-02-16 18:33:13 +01:00
parent 9ee4b5b2b4
commit 860ce1b597
9 changed files with 28 additions and 14 deletions

View File

@ -74,11 +74,13 @@ pub struct Parameters {
```Rust ```Rust
pub struct Parameters { pub struct Parameters {
pub quality: u32, pub quality: u32,
pub force_zopfli: bool pub force_zopfli: bool,
pub deflater_level: u32
} }
``` ```
- `quality`: in a range from 0 to 100, the quality of the resulting image. Default `80`. - `quality`: in a range from 0 to 100, the quality of the resulting image. Default `80`.
- `force_zopfli`: if `optimization` is `true` and this option is also `true`, will use zopfli algorithm for compression, resulting in a smaller image, but it may take minutes to finish the process. Default `false`. - `force_zopfli`: if `optimization` is `true` and this option is also `true`, will use zopfli algorithm for compression, resulting in a smaller image, but it may take minutes to finish the process. Default `false`.
- `optimization_level`: if `optimization` is `true` will set the level of oxipng optimization, from 1 to 6. Default `3`.
#### gif #### gif
GIF support is experimental, has many know issues and does not support optimization. Expect bugs (especially on Windows). GIF support is experimental, has many know issues and does not support optimization. Expect bugs (especially on Windows).
@ -171,6 +173,7 @@ pub struct CCSParameters {
pub jpeg_quality: u32, pub jpeg_quality: u32,
pub jpeg_chroma_subsampling: u32, pub jpeg_chroma_subsampling: u32,
pub png_quality: u32, pub png_quality: u32,
pub png_optimization_level: u32,
pub png_force_zopfli: bool, pub png_force_zopfli: bool,
pub gif_quality: u32, pub gif_quality: u32,
pub webp_quality: u32, pub webp_quality: u32,

View File

@ -1,8 +1,8 @@
use std::ffi::CString; use std::ffi::CString;
use std::os::raw::{c_int, c_void}; use std::os::raw::{c_int, c_void};
use crate::error::CaesiumError;
use crate::CSParameters; use crate::CSParameters;
use crate::error::CaesiumError;
pub fn compress( pub fn compress(
input_path: String, input_path: String,

View File

@ -1,9 +1,10 @@
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
use std::os::raw::c_char; use std::os::raw::c_char;
use tiff::encoder::compression::DeflateLevel::{Balanced, Best, Fast}; use tiff::encoder::compression::DeflateLevel::{Balanced, Best, Fast};
use crate::{compress, compress_to_size, CSParameters, error, initialize_parameters};
use crate::jpeg::ChromaSubsampling; use crate::jpeg::ChromaSubsampling;
use crate::{compress, compress_to_size, error, initialize_parameters, CSParameters};
use crate::tiff::TiffCompression::{Deflate, Lzw, Packbits, Uncompressed}; use crate::tiff::TiffCompression::{Deflate, Lzw, Packbits, Uncompressed};
#[repr(C)] #[repr(C)]
@ -12,6 +13,7 @@ pub struct CCSParameters {
pub jpeg_quality: u32, pub jpeg_quality: u32,
pub jpeg_chroma_subsampling: u32, pub jpeg_chroma_subsampling: u32,
pub png_quality: u32, pub png_quality: u32,
pub png_optimization_level: bool,
pub png_force_zopfli: bool, pub png_force_zopfli: bool,
pub gif_quality: u32, pub gif_quality: u32,
pub webp_quality: u32, pub webp_quality: u32,
@ -98,6 +100,7 @@ fn c_set_parameters(params: CCSParameters) -> CSParameters {
parameters.png.quality = params.png_quality; parameters.png.quality = params.png_quality;
parameters.optimize = params.optimize; parameters.optimize = params.optimize;
parameters.keep_metadata = params.keep_metadata; parameters.keep_metadata = params.keep_metadata;
parameters.png.optimization_level = params.png_optimization_level as u8;
parameters.png.force_zopfli = params.png_force_zopfli; parameters.png.force_zopfli = params.png_force_zopfli;
parameters.gif.quality = params.gif_quality; parameters.gif.quality = params.gif_quality;
parameters.webp.quality = params.webp_quality; parameters.webp.quality = params.webp_quality;

View File

@ -1,18 +1,18 @@
use std::{fs, ptr};
use std::fs::File; use std::fs::File;
use std::io::Write; use std::io::Write;
use std::mem; use std::mem;
use std::panic::catch_unwind; use std::panic::catch_unwind;
use std::{fs, ptr};
use image::ImageOutputFormat::Jpeg; use image::ImageOutputFormat::Jpeg;
use img_parts::jpeg::Jpeg as PartsJpeg;
use img_parts::{ImageEXIF, ImageICC}; use img_parts::{ImageEXIF, ImageICC};
use img_parts::jpeg::Jpeg as PartsJpeg;
use libc::free; use libc::free;
use mozjpeg_sys::*; use mozjpeg_sys::*;
use crate::CSParameters;
use crate::error::CaesiumError; use crate::error::CaesiumError;
use crate::resize::resize; use crate::resize::resize;
use crate::CSParameters;
static mut JPEG_ERROR: c_int = 0; static mut JPEG_ERROR: c_int = 0;

View File

@ -1,8 +1,8 @@
extern crate alloc; extern crate alloc;
use std::{cmp, fs};
use std::fs::File; use std::fs::File;
use std::io::Write; use std::io::Write;
use std::{cmp, fs};
use ::tiff::encoder::compression::DeflateLevel; use ::tiff::encoder::compression::DeflateLevel;
use ::tiff::encoder::compression::DeflateLevel::Best; use ::tiff::encoder::compression::DeflateLevel::Best;
@ -39,6 +39,7 @@ pub struct JpegParameters {
pub struct PngParameters { pub struct PngParameters {
pub quality: u32, pub quality: u32,
pub force_zopfli: bool, pub force_zopfli: bool,
pub optimization_level: u8
} }
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -79,6 +80,7 @@ pub fn initialize_parameters() -> CSParameters {
let png = PngParameters { let png = PngParameters {
quality: 80, quality: 80,
force_zopfli: false, force_zopfli: false,
optimization_level: 3,
}; };
let gif = GifParameters { quality: 80 }; let gif = GifParameters { quality: 80 };
let webp = WebPParameters { quality: 80 }; let webp = WebPParameters { quality: 80 };
@ -327,6 +329,13 @@ fn validate_parameters(parameters: &CSParameters) -> error::Result<()> {
}); });
} }
if parameters.png.optimization_level > 6 {
return Err(CaesiumError {
message: "Invalid PNG optimization level".into(),
code: 10006,
});
}
if parameters.gif.quality > 100 { if parameters.gif.quality > 100 {
return Err(CaesiumError { return Err(CaesiumError {
message: "Invalid GIF quality value".into(), message: "Invalid GIF quality value".into(),

View File

@ -4,11 +4,11 @@ use std::io::Write;
use std::num::NonZeroU8; use std::num::NonZeroU8;
use image::ImageOutputFormat; use image::ImageOutputFormat;
use oxipng::Deflaters::{Libdeflater, Zopfli}; use oxipng::Deflaters::Zopfli;
use crate::CSParameters;
use crate::error::CaesiumError; use crate::error::CaesiumError;
use crate::resize::resize; use crate::resize::resize;
use crate::CSParameters;
pub fn compress( pub fn compress(
input_path: String, input_path: String,
@ -122,8 +122,7 @@ fn lossless(in_file: Vec<u8>, parameters: &CSParameters) -> Result<Vec<u8>, Caes
iterations: NonZeroU8::new(15).unwrap(), iterations: NonZeroU8::new(15).unwrap(),
}; };
} else { } else {
oxipng_options = oxipng::Options::from_preset(3); oxipng_options = oxipng::Options::from_preset(parameters.png.optimization_level);
oxipng_options.deflate = Libdeflater { compression: 6 };
} }
let optimized_png = let optimized_png =

View File

@ -1,8 +1,8 @@
use std::io::Cursor; use std::io::Cursor;
use image::DynamicImage;
use image::imageops::FilterType; use image::imageops::FilterType;
use image::io::Reader as ImageReader; use image::io::Reader as ImageReader;
use image::DynamicImage;
use crate::error::CaesiumError; use crate::error::CaesiumError;

View File

@ -6,9 +6,9 @@ use tiff::encoder::colortype::{RGB8, RGBA8};
use tiff::encoder::compression::{Deflate, Lzw, Packbits, Uncompressed}; use tiff::encoder::compression::{Deflate, Lzw, Packbits, Uncompressed};
use tiff::encoder::TiffEncoder; use tiff::encoder::TiffEncoder;
use crate::CSParameters;
use crate::error::CaesiumError; use crate::error::CaesiumError;
use crate::resize::resize_image; use crate::resize::resize_image;
use crate::CSParameters;
#[derive(Copy, Clone, PartialEq)] #[derive(Copy, Clone, PartialEq)]
pub enum TiffCompression { pub enum TiffCompression {

View File

@ -2,9 +2,9 @@ use std::fs::File;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::ops::Deref; use std::ops::Deref;
use crate::CSParameters;
use crate::error::CaesiumError; use crate::error::CaesiumError;
use crate::resize::resize_image; use crate::resize::resize_image;
use crate::CSParameters;
pub fn compress( pub fn compress(
input_path: String, input_path: String,