8
8
use std:: borrow:: Cow ;
9
9
use std:: io:: { BufRead , Seek , Write } ;
10
10
11
- use png:: { BlendOp , DisposeOp } ;
11
+ use png:: { BlendOp , DeflateCompression , DisposeOp } ;
12
12
13
13
use crate :: animation:: { Delay , Frame , Frames , Ratio } ;
14
14
use crate :: color:: { Blend , ColorType , ExtendedColorType } ;
@@ -523,7 +523,7 @@ pub struct PngEncoder<W: Write> {
523
523
exif_metadata : Vec < u8 > ,
524
524
}
525
525
526
- /// Compression level of a PNG encoder. The default setting is `Fast`.
526
+ /// DEFLATE compression level of a PNG encoder. The default setting is `Fast`.
527
527
#[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
528
528
#[ non_exhaustive]
529
529
#[ derive( Default ) ]
@@ -535,6 +535,10 @@ pub enum CompressionType {
535
535
Fast ,
536
536
/// High compression level
537
537
Best ,
538
+ /// No compression whatsoever
539
+ Uncompressed ,
540
+ /// Detailed compression level between 1 and 9
541
+ Level ( u8 ) ,
538
542
}
539
543
540
544
/// Filter algorithms used to process image data to improve compression.
@@ -628,7 +632,17 @@ impl<W: Write> PngEncoder<W> {
628
632
let comp = match self . compression {
629
633
CompressionType :: Default => png:: Compression :: Balanced ,
630
634
CompressionType :: Best => png:: Compression :: High ,
631
- _ => png:: Compression :: Fast ,
635
+ CompressionType :: Fast => png:: Compression :: Fast ,
636
+ CompressionType :: Uncompressed => png:: Compression :: NoCompression ,
637
+ CompressionType :: Level ( 0 ) => png:: Compression :: NoCompression ,
638
+ CompressionType :: Level ( _) => png:: Compression :: Fast , // whatever, will be overridden
639
+ } ;
640
+
641
+ let advanced_comp = match self . compression {
642
+ // Do not set level 0 as a Zlib level to avoid Zlib backend variance.
643
+ // For example, in miniz_oxide level 0 is very slow.
644
+ CompressionType :: Level ( n @ 1 ..) => Some ( DeflateCompression :: Level ( n) ) ,
645
+ _ => None ,
632
646
} ;
633
647
634
648
let filter = match self . filter {
@@ -655,6 +669,9 @@ impl<W: Write> PngEncoder<W> {
655
669
encoder. set_color ( ct) ;
656
670
encoder. set_depth ( bits) ;
657
671
encoder. set_compression ( comp) ;
672
+ if let Some ( compression) = advanced_comp {
673
+ encoder. set_deflate_compression ( compression) ;
674
+ }
658
675
encoder. set_filter ( filter) ;
659
676
let mut writer = encoder
660
677
. write_header ( )
0 commit comments