chore: upgrade image from 0.24.9 to 0.25.1

This commit is contained in:
link2xt
2024-04-03 20:26:52 +00:00
parent 0be8b5a5c4
commit 50165b3e35
3 changed files with 53 additions and 17 deletions

39
Cargo.lock generated
View File

@@ -2505,17 +2505,29 @@ dependencies = [
[[package]] [[package]]
name = "image" name = "image"
version = "0.24.9" version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"byteorder", "byteorder",
"color_quant", "color_quant",
"gif", "gif",
"jpeg-decoder", "image-webp",
"num-traits", "num-traits",
"png", "png",
"zune-core",
"zune-jpeg",
]
[[package]]
name = "image-webp"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a84a25dcae3ac487bc24ef280f9e20c79c9b1a3e5e32cbed3041d1c514aa87c"
dependencies = [
"byteorder",
"thiserror",
] ]
[[package]] [[package]]
@@ -2640,12 +2652,6 @@ version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
[[package]]
name = "jpeg-decoder"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0"
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.69" version = "0.3.69"
@@ -5900,3 +5906,18 @@ dependencies = [
"quote", "quote",
"syn 2.0.57", "syn 2.0.57",
] ]
[[package]]
name = "zune-core"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a"
[[package]]
name = "zune-jpeg"
version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448"
dependencies = [
"zune-core",
]

View File

@@ -57,7 +57,7 @@ futures-lite = "2.3.0"
hex = "0.4.0" hex = "0.4.0"
hickory-resolver = "0.24" hickory-resolver = "0.24"
humansize = "2" humansize = "2"
image = { version = "0.24.9", default-features=false, features = ["gif", "jpeg", "ico", "png", "pnm", "webp", "bmp"] } image = { version = "0.25.1", default-features=false, features = ["gif", "jpeg", "ico", "png", "pnm", "webp", "bmp"] }
iroh = { version = "0.4.2", default-features = false } iroh = { version = "0.4.2", default-features = false }
kamadak-exif = "0.5" kamadak-exif = "0.5"
lettre_email = { git = "https://github.com/deltachat/lettre", branch = "master" } lettre_email = { git = "https://github.com/deltachat/lettre", branch = "master" }

View File

@@ -11,9 +11,8 @@ use std::path::{Path, PathBuf};
use anyhow::{format_err, Context as _, Result}; use anyhow::{format_err, Context as _, Result};
use base64::Engine as _; use base64::Engine as _;
use futures::StreamExt; use futures::StreamExt;
use image::{ use image::codecs::jpeg::JpegEncoder;
DynamicImage, GenericImage, GenericImageView, ImageFormat, ImageOutputFormat, Pixel, Rgba, use image::{DynamicImage, GenericImage, GenericImageView, ImageFormat, Pixel, Rgba};
};
use num_traits::FromPrimitive; use num_traits::FromPrimitive;
use tokio::io::AsyncWriteExt; use tokio::io::AsyncWriteExt;
use tokio::{fs, io}; use tokio::{fs, io};
@@ -37,6 +36,12 @@ pub struct BlobObject<'a> {
name: String, name: String,
} }
#[derive(Debug, Clone)]
enum ImageOutputFormat {
Png,
Jpeg { quality: u8 },
}
impl<'a> BlobObject<'a> { impl<'a> BlobObject<'a> {
/// Creates a new blob object with a unique name. /// Creates a new blob object with a unique name.
/// ///
@@ -457,9 +462,13 @@ impl<'a> BlobObject<'a> {
Ok(ImageFormat::Png) if !exceeds_max_bytes => ImageOutputFormat::Png, Ok(ImageFormat::Png) if !exceeds_max_bytes => ImageOutputFormat::Png,
Ok(ImageFormat::Jpeg) => { Ok(ImageFormat::Jpeg) => {
add_white_bg = false; add_white_bg = false;
ImageOutputFormat::Jpeg(jpeg_quality) ImageOutputFormat::Jpeg {
quality: jpeg_quality,
}
} }
_ => ImageOutputFormat::Jpeg(jpeg_quality), _ => ImageOutputFormat::Jpeg {
quality: jpeg_quality,
},
}; };
// We need to rewrite images with Exif to remove metadata such as location, // We need to rewrite images with Exif to remove metadata such as location,
// camera model, etc. // camera model, etc.
@@ -530,7 +539,7 @@ impl<'a> BlobObject<'a> {
if do_scale || exif.is_some() { if do_scale || exif.is_some() {
// The file format is JPEG/PNG now, we may have to change the file extension // The file format is JPEG/PNG now, we may have to change the file extension
if !matches!(fmt, Ok(ImageFormat::Jpeg)) if !matches!(fmt, Ok(ImageFormat::Jpeg))
&& matches!(ofmt, ImageOutputFormat::Jpeg(_)) && matches!(ofmt, ImageOutputFormat::Jpeg { .. })
{ {
blob_abs = blob_abs.with_extension("jpg"); blob_abs = blob_abs.with_extension("jpg");
let file_name = blob_abs.file_name().context("No image file name (???)")?; let file_name = blob_abs.file_name().context("No image file name (???)")?;
@@ -685,7 +694,13 @@ fn encode_img(
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
encoded.clear(); encoded.clear();
let mut buf = Cursor::new(encoded); let mut buf = Cursor::new(encoded);
img.write_to(&mut buf, fmt)?; match fmt {
ImageOutputFormat::Png => img.write_to(&mut buf, ImageFormat::Png)?,
ImageOutputFormat::Jpeg { quality } => {
let encoder = JpegEncoder::new_with_quality(&mut buf, quality);
img.write_with_encoder(encoder)?;
}
}
Ok(()) Ok(())
} }