v10 (#748)
This commit is contained in:
parent
6a2379ce78
commit
58eec39cc8
8 changed files with 107 additions and 75 deletions
19
CHANGELOG.md
19
CHANGELOG.md
|
|
@ -1,3 +1,22 @@
|
||||||
|
## Version 10.0.0
|
||||||
|
|
||||||
|
- [Breaking] CLI: Change short zopfli flag from `-Z` to `-z`.
|
||||||
|
- [Breaking] CLI: Change `--pretend`/`-P` to `--dry-run`/`-D`.
|
||||||
|
- [Breaking] CLI: Change `--interlace` options from `1`/`0` to `on`/`off`.
|
||||||
|
- [Breaking] API: Change `Options.interlace: Option<Interlacing>` to `Options.interlace: Option<bool>`.
|
||||||
|
- [Breaking] API: Change `Options.filter: IndexSet<RowFilter>` to `Options.filters: IndexSet<FilterStrategy>`.
|
||||||
|
- [Breaking] API: Change `Options.deflate: Deflaters` to `Options.deflater: Deflater`.
|
||||||
|
- [Breaking] API: Change `Deflaters::Zopfli { .. }` to `Deflater::Zopfli(ZopfliOptions { .. })`.
|
||||||
|
- [Breaking] API: Change `optimize()` to return `(usize, usize)`, with original and optimized sizes.
|
||||||
|
- [Feature] Allow zopfli iterations higher than 255.
|
||||||
|
- [Feature] Add `--ziwi` option for zopfli iterations without improvement.
|
||||||
|
- [Feature] Add `--max-raw-size` option to skip images that are too large.
|
||||||
|
- [Feature] Add `--brute-level` and `--brute-lines` options for advanced control of Brute filter.
|
||||||
|
- [Improvement] Reduce memory usage for `fast` mode.
|
||||||
|
- [Improvement] Slightly improve compression with Brute filter at levels 5 and 6.
|
||||||
|
- [Misc] Change `--preserve` option to no longer preserve last access time.
|
||||||
|
- [Misc] Make help output colored.
|
||||||
|
|
||||||
## Version 9.1.5
|
## Version 9.1.5
|
||||||
|
|
||||||
- [Feature] Add `--sequential` option to process files sequentially rather than in parallel.
|
- [Feature] Add `--sequential` option to process files sequentially rather than in parallel.
|
||||||
|
|
|
||||||
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -406,7 +406,7 @@ checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxipng"
|
name = "oxipng"
|
||||||
version = "9.1.5"
|
version = "10.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitvec",
|
"bitvec",
|
||||||
"clap",
|
"clap",
|
||||||
|
|
|
||||||
40
Cargo.toml
40
Cargo.toml
|
|
@ -20,7 +20,7 @@ homepage = "https://github.com/oxipng/oxipng"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
name = "oxipng"
|
name = "oxipng"
|
||||||
repository = "https://github.com/oxipng/oxipng"
|
repository = "https://github.com/oxipng/oxipng"
|
||||||
version = "9.1.5"
|
version = "10.0.0"
|
||||||
rust-version = "1.85.1"
|
rust-version = "1.85.1"
|
||||||
|
|
||||||
[badges]
|
[badges]
|
||||||
|
|
@ -113,18 +113,36 @@ assets = [
|
||||||
["CHANGELOG.md", "usr/share/doc/oxipng/", "644"],
|
["CHANGELOG.md", "usr/share/doc/oxipng/", "644"],
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[lints.rust]
|
||||||
|
missing_copy_implementations = "deny"
|
||||||
|
missing_debug_implementations = "deny"
|
||||||
|
trivial_casts = "warn"
|
||||||
|
trivial_numeric_casts = "warn"
|
||||||
|
unused_import_braces = "warn"
|
||||||
|
|
||||||
[lints.clippy]
|
[lints.clippy]
|
||||||
unnecessary_semicolon = "warn"
|
|
||||||
use_self = "warn"
|
|
||||||
ignored_unit_patterns = "warn"
|
|
||||||
unseparated_literal_suffix = "warn"
|
|
||||||
missing_const_for_fn = "warn"
|
|
||||||
redundant_closure_for_method_calls = "warn"
|
|
||||||
option_if_let_else = "warn"
|
|
||||||
redundant_clone = "warn"
|
|
||||||
semicolon_if_nothing_returned = "warn"
|
|
||||||
cloned_instead_of_copied = "warn"
|
cloned_instead_of_copied = "warn"
|
||||||
|
expl_impl_clone_on_copy = "warn"
|
||||||
|
float_cmp_const = "warn"
|
||||||
if_not_else = "warn"
|
if_not_else = "warn"
|
||||||
useless_let_if_seq = "warn"
|
ignored_unit_patterns = "warn"
|
||||||
|
linkedlist = "warn"
|
||||||
manual_let_else = "warn"
|
manual_let_else = "warn"
|
||||||
|
map_flatten = "warn"
|
||||||
map_unwrap_or = "warn"
|
map_unwrap_or = "warn"
|
||||||
|
match_same_arms = "warn"
|
||||||
|
mem_forget = "warn"
|
||||||
|
missing_const_for_fn = "warn"
|
||||||
|
mut_mut = "warn"
|
||||||
|
mutex_integer = "warn"
|
||||||
|
needless_continue = "warn"
|
||||||
|
option_if_let_else = "warn"
|
||||||
|
path_buf_push_overwrite = "warn"
|
||||||
|
range_plus_one = "warn"
|
||||||
|
redundant_clone = "warn"
|
||||||
|
redundant_closure_for_method_calls = "warn"
|
||||||
|
semicolon_if_nothing_returned = "warn"
|
||||||
|
unnecessary_semicolon = "warn"
|
||||||
|
unseparated_literal_suffix = "warn"
|
||||||
|
use_self = "warn"
|
||||||
|
useless_let_if_seq = "warn"
|
||||||
|
|
|
||||||
71
MANUAL.txt
71
MANUAL.txt
|
|
@ -1,4 +1,4 @@
|
||||||
oxipng 9.1.5
|
oxipng 10.0.0
|
||||||
Losslessly improve compression of PNG files
|
Losslessly improve compression of PNG files
|
||||||
|
|
||||||
Usage: oxipng [OPTIONS] <files>...
|
Usage: oxipng [OPTIONS] <files>...
|
||||||
|
|
@ -13,14 +13,14 @@ Options:
|
||||||
compression. Lower levels are faster, higher levels provide better compression, though
|
compression. Lower levels are faster, higher levels provide better compression, though
|
||||||
with increasingly diminishing returns.
|
with increasingly diminishing returns.
|
||||||
|
|
||||||
0 => --zc 5 --fast (1 trial, determined heuristically)
|
0 => --zc 5 --fast (filter chosen heuristically)
|
||||||
1 => --zc 10 --fast (1 trial, determined heuristically)
|
1 => --zc 10 --fast (filter chosen heuristically)
|
||||||
2 => --zc 11 -f 0,1,6,7 --fast (4 fast trials, 1 main trial)
|
2 => --zc 11 -f 0,1,6,7 --fast
|
||||||
3 => --zc 11 -f 0,7,8,9 (4 trials)
|
3 => --zc 11 -f 0,7,8,9 --brute-level 1 --brute-lines 3
|
||||||
4 => --zc 12 -f 0,7,8,9 (4 trials)
|
4 => --zc 12 -f 0,7,8,9 --brute-level 1 --brute-lines 4
|
||||||
5 => --zc 12 -f 0,1,2,5,6,7,8,9 (8 trials)
|
5 => --zc 12 -f 0,1,2,5,6,7,8,9 --brute-level 4 --brute-lines 4
|
||||||
6 => --zc 12 -f 0-9 (10 trials)
|
6 => --zc 12 -f 0-9 --brute-level 5 --brute-lines 8
|
||||||
max => (stable alias for the max level)
|
max => (stable alias for the maximum level)
|
||||||
|
|
||||||
Manually specifying a compression option (zc, f, etc.) will override the optimization
|
Manually specifying a compression option (zc, f, etc.) will override the optimization
|
||||||
preset, regardless of the order you write the arguments.
|
preset, regardless of the order you write the arguments.
|
||||||
|
|
@ -45,7 +45,7 @@ Options:
|
||||||
-p, --preserve
|
-p, --preserve
|
||||||
Preserve file permissions and timestamps if possible
|
Preserve file permissions and timestamps if possible
|
||||||
|
|
||||||
-P, --pretend
|
-d, --dry-run
|
||||||
Do not write any files, only show compression results
|
Do not write any files, only show compression results
|
||||||
|
|
||||||
-s
|
-s
|
||||||
|
|
@ -61,10 +61,14 @@ Options:
|
||||||
|
|
||||||
CAUTION: 'all' will convert APNGs to standard PNGs.
|
CAUTION: 'all' will convert APNGs to standard PNGs.
|
||||||
|
|
||||||
Note that 'bKGD', 'sBIT' and 'hIST' will be forcibly stripped if the color type or bit
|
Please note that regardless of any options set, some chunks will necessarily be stripped
|
||||||
depth is changed, regardless of any options set.
|
when invalidated by the optimization:
|
||||||
|
bKGD, sBIT, hIST: Stripped if the color type or bit depth changes.
|
||||||
|
iDOT: Always stripped.
|
||||||
|
caBX: Stripped if it contains C2PA metadata. If explicitly retained by `--keep`,
|
||||||
|
optimization will be aborted.
|
||||||
|
|
||||||
The default when --strip is not passed is to keep all metadata.
|
The default when --strip is not passed is to keep all chunks that remain valid.
|
||||||
|
|
||||||
--keep <list>
|
--keep <list>
|
||||||
Strip all metadata chunks except those in the comma-separated list. The special value
|
Strip all metadata chunks except those in the comma-separated list. The special value
|
||||||
|
|
@ -79,17 +83,17 @@ Options:
|
||||||
but take care as while this is “visually lossless”, it is technically a lossy
|
but take care as while this is “visually lossless”, it is technically a lossy
|
||||||
transformation and may be unsuitable for some applications.
|
transformation and may be unsuitable for some applications.
|
||||||
|
|
||||||
-i, --interlace <type>
|
-i, --interlace <mode>
|
||||||
Set the PNG interlacing type, where <type> is one of:
|
Set the PNG interlacing mode, where <mode> is one of:
|
||||||
|
|
||||||
0 => Remove interlacing from all images that are processed
|
off => Remove interlacing from all images that are processed
|
||||||
1 => Apply Adam7 interlacing on all images that are processed
|
on => Apply Adam7 interlacing on all images that are processed
|
||||||
keep => Keep the existing interlacing type of each image
|
keep => Keep the existing interlacing mode of each image
|
||||||
|
|
||||||
Note that interlacing can add 25-50% to the size of an optimized image. Only use it if you
|
Note that interlacing can add 25-50% to the size of an optimized image. Only use it if you
|
||||||
believe the benefits outweigh the costs for your use case.
|
believe the benefits outweigh the costs for your use case.
|
||||||
|
|
||||||
[default: 0]
|
[default: off]
|
||||||
|
|
||||||
--scale16
|
--scale16
|
||||||
Forcibly reduce images with 16 bits per channel to 8 bits per channel. This is a lossy
|
Forcibly reduce images with 16 bits per channel to 8 bits per channel. This is a lossy
|
||||||
|
|
@ -119,9 +123,9 @@ Options:
|
||||||
|
|
||||||
Heuristic strategies (try to find the best delta filter for each line)
|
Heuristic strategies (try to find the best delta filter for each line)
|
||||||
5 => MinSum Minimum sum of absolute differences
|
5 => MinSum Minimum sum of absolute differences
|
||||||
6 => Entropy Highest Shannon entropy
|
6 => Entropy Smallest Shannon entropy
|
||||||
7 => Bigrams Lowest count of distinct bigrams
|
7 => Bigrams Lowest count of distinct bigrams
|
||||||
8 => BigEnt Highest Shannon entropy of bigrams
|
8 => BigEnt Smallest Shannon entropy of bigrams
|
||||||
9 => Brute Smallest compressed size (slow)
|
9 => Brute Smallest compressed size (slow)
|
||||||
|
|
||||||
The default value depends on the optimization level preset.
|
The default value depends on the optimization level preset.
|
||||||
|
|
@ -159,12 +163,12 @@ Options:
|
||||||
|
|
||||||
--fix
|
--fix
|
||||||
Do not perform checksum validation of PNG chunks. This may allow some files with errors to
|
Do not perform checksum validation of PNG chunks. This may allow some files with errors to
|
||||||
be processed successfully.
|
be processed successfully. The output will always have correct checksums.
|
||||||
|
|
||||||
--force
|
--force
|
||||||
Write the output even if it is larger than the input
|
Write the output even if it is larger than the input
|
||||||
|
|
||||||
-Z, --zopfli
|
-z, --zopfli
|
||||||
Use the much slower but stronger Zopfli compressor for main compression trials.
|
Use the much slower but stronger Zopfli compressor for main compression trials.
|
||||||
Recommended use is with '-o max' and '--fast'.
|
Recommended use is with '-o max' and '--fast'.
|
||||||
|
|
||||||
|
|
@ -174,6 +178,18 @@ Options:
|
||||||
|
|
||||||
[default: 15]
|
[default: 15]
|
||||||
|
|
||||||
|
--ziwi <iterations>
|
||||||
|
Stop Zopfli compression after this number of iterations without improvement. Use this in
|
||||||
|
conjunction with a high value for '--zi' to achieve better compression in reasonable time.
|
||||||
|
|
||||||
|
--brute-level <level>
|
||||||
|
Set the libdeflate compression level to use with the Brute filter strategy. Sane values
|
||||||
|
are 1-5. Higher values are not necessarily better.
|
||||||
|
|
||||||
|
--brute-lines <lines>
|
||||||
|
Set the number of lines to compress at once with the Brute filter strategy. Sane values
|
||||||
|
are 2-16. Higher values are not necessarily better.
|
||||||
|
|
||||||
--timeout <secs>
|
--timeout <secs>
|
||||||
Maximum amount of time, in seconds, to spend on optimizations. Oxipng will check the
|
Maximum amount of time, in seconds, to spend on optimizations. Oxipng will check the
|
||||||
timeout before each transformation or compression trial, and will stop trying to optimize
|
timeout before each transformation or compression trial, and will stop trying to optimize
|
||||||
|
|
@ -181,6 +197,15 @@ Options:
|
||||||
are already in progress, so it is currently of limited effectiveness for large files with
|
are already in progress, so it is currently of limited effectiveness for large files with
|
||||||
high compression levels.
|
high compression levels.
|
||||||
|
|
||||||
|
--max-raw-size <bytes>
|
||||||
|
Maximum size to allow for the input image. If the raw, decompressed image data (or the
|
||||||
|
file size) of the image exceeds this size, it will be skipped. This is useful for limiting
|
||||||
|
memory usage or avoiding long processing times on large images. The value may be specified
|
||||||
|
with a unit suffix such as k, KB, m, MB, etc.
|
||||||
|
|
||||||
|
The decompressed size of an image is roughly equal to width * height * bit-depth / 8. E.g.
|
||||||
|
a 1920x1080 image with 24-bit color depth would be roughly 6MB.
|
||||||
|
|
||||||
-t, --threads <num>
|
-t, --threads <num>
|
||||||
Set the maximum number of threads to use. Oxipng uses multithreading to evaluate multiple
|
Set the maximum number of threads to use. Oxipng uses multithreading to evaluate multiple
|
||||||
optimizations on the same file in parallel as well as process multiple files in parallel.
|
optimizations on the same file in parallel as well as process multiple files in parallel.
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ preamble to an already existing one:
|
||||||
```yaml
|
```yaml
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/oxipng/oxipng
|
- repo: https://github.com/oxipng/oxipng
|
||||||
rev: v9.1.5
|
rev: v10.0.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: oxipng
|
- id: oxipng
|
||||||
args: ["-o", "4", "--strip", "safe", "--alpha"]
|
args: ["-o", "4", "--strip", "safe", "--alpha"]
|
||||||
|
|
@ -117,7 +117,7 @@ input filename, into the [optimize function](https://docs.rs/oxipng/latest/oxipn
|
||||||
It is recommended to disable the "binary" feature when including Oxipng as a library. Currently, there is
|
It is recommended to disable the "binary" feature when including Oxipng as a library. Currently, there is
|
||||||
no simple way to just disable one feature in Cargo, it has to be done by disabling default features
|
no simple way to just disable one feature in Cargo, it has to be done by disabling default features
|
||||||
and specifying the desired ones, for example:
|
and specifying the desired ones, for example:
|
||||||
`oxipng = { version = "9.0", features = ["parallel", "zopfli", "filetime"], default-features = false }`
|
`oxipng = { version = "10.0", features = ["parallel", "zopfli", "filetime"], default-features = false }`
|
||||||
|
|
||||||
## Software using Oxipng
|
## Software using Oxipng
|
||||||
|
|
||||||
|
|
|
||||||
10
src/cli.rs
10
src/cli.rs
|
|
@ -133,10 +133,14 @@ Strip metadata chunks, where <mode> is one of:
|
||||||
|
|
||||||
CAUTION: 'all' will convert APNGs to standard PNGs.
|
CAUTION: 'all' will convert APNGs to standard PNGs.
|
||||||
|
|
||||||
Note that 'bKGD', 'sBIT' and 'hIST' will be forcibly stripped if the color type or bit \
|
Please note that regardless of any options set, some chunks will necessarily be stripped \
|
||||||
depth is changed, regardless of any options set.
|
when invalidated by the optimization:
|
||||||
|
bKGD, sBIT, hIST: Stripped if the color type or bit depth changes.
|
||||||
|
iDOT: Always stripped.
|
||||||
|
caBX: Stripped if it contains C2PA metadata. If explicitly retained by `--keep`, \
|
||||||
|
optimization will be aborted.
|
||||||
|
|
||||||
The default when --strip is not passed is to keep all metadata.",
|
The default when --strip is not passed is to keep all chunks that remain valid.",
|
||||||
DISPLAY_CHUNKS
|
DISPLAY_CHUNKS
|
||||||
.iter()
|
.iter()
|
||||||
.map(|c| String::from_utf8_lossy(c))
|
.map(|c| String::from_utf8_lossy(c))
|
||||||
|
|
|
||||||
21
src/lib.rs
21
src/lib.rs
|
|
@ -1,23 +1,4 @@
|
||||||
#![warn(trivial_casts, trivial_numeric_casts, unused_import_braces)]
|
#![cfg_attr(not(feature = "zopfli"), allow(unreachable_patterns))]
|
||||||
#![deny(missing_debug_implementations, missing_copy_implementations)]
|
|
||||||
#![warn(clippy::expl_impl_clone_on_copy)]
|
|
||||||
#![warn(clippy::float_cmp_const)]
|
|
||||||
#![warn(clippy::linkedlist)]
|
|
||||||
#![warn(clippy::map_flatten)]
|
|
||||||
#![warn(clippy::match_same_arms)]
|
|
||||||
#![warn(clippy::mem_forget)]
|
|
||||||
#![warn(clippy::mut_mut)]
|
|
||||||
#![warn(clippy::mutex_integer)]
|
|
||||||
#![warn(clippy::needless_continue)]
|
|
||||||
#![warn(clippy::path_buf_push_overwrite)]
|
|
||||||
#![warn(clippy::range_plus_one)]
|
|
||||||
#![allow(clippy::cognitive_complexity)]
|
|
||||||
#![allow(clippy::upper_case_acronyms)]
|
|
||||||
#![cfg_attr(
|
|
||||||
not(feature = "zopfli"),
|
|
||||||
allow(irrefutable_let_patterns),
|
|
||||||
allow(unreachable_patterns)
|
|
||||||
)]
|
|
||||||
|
|
||||||
#[cfg(feature = "parallel")]
|
#[cfg(feature = "parallel")]
|
||||||
extern crate rayon;
|
extern crate rayon;
|
||||||
|
|
|
||||||
15
src/main.rs
15
src/main.rs
|
|
@ -1,18 +1,3 @@
|
||||||
#![warn(trivial_casts, trivial_numeric_casts, unused_import_braces)]
|
|
||||||
#![deny(missing_debug_implementations, missing_copy_implementations)]
|
|
||||||
#![warn(clippy::expl_impl_clone_on_copy)]
|
|
||||||
#![warn(clippy::float_cmp_const)]
|
|
||||||
#![warn(clippy::linkedlist)]
|
|
||||||
#![warn(clippy::map_flatten)]
|
|
||||||
#![warn(clippy::match_same_arms)]
|
|
||||||
#![warn(clippy::mem_forget)]
|
|
||||||
#![warn(clippy::mut_mut)]
|
|
||||||
#![warn(clippy::mutex_integer)]
|
|
||||||
#![warn(clippy::needless_continue)]
|
|
||||||
#![warn(clippy::path_buf_push_overwrite)]
|
|
||||||
#![warn(clippy::range_plus_one)]
|
|
||||||
#![allow(clippy::cognitive_complexity)]
|
|
||||||
|
|
||||||
#[cfg(not(feature = "parallel"))]
|
#[cfg(not(feature = "parallel"))]
|
||||||
mod rayon;
|
mod rayon;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue