From 9df18a1674f2995701b0bf68594183ba359be2a7 Mon Sep 17 00:00:00 2001 From: Pretorer <39985339+Pretorer@users.noreply.github.com> Date: Tue, 11 Jan 2022 15:43:00 +0100 Subject: [PATCH 1/2] fixed deflate and packbits --- src/encoder/compression/deflate.rs | 2 +- src/encoder/compression/packbits.rs | 1 + src/encoder/mod.rs | 7 ++++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/encoder/compression/deflate.rs b/src/encoder/compression/deflate.rs index c198dbc..db64b70 100644 --- a/src/encoder/compression/deflate.rs +++ b/src/encoder/compression/deflate.rs @@ -53,7 +53,7 @@ impl Compression for Deflate { impl CompressionAlgorithm for Deflate { fn write_to(&mut self, writer: &mut W, bytes: &[u8]) -> Result { let mut encoder = ZlibEncoder::new(writer, self.level); - encoder.write(&bytes)?; + encoder.write_all(&bytes)?; encoder.try_finish()?; Ok(encoder.total_out()) } diff --git a/src/encoder/compression/packbits.rs b/src/encoder/compression/packbits.rs index fc032d0..464d1e7 100644 --- a/src/encoder/compression/packbits.rs +++ b/src/encoder/compression/packbits.rs @@ -122,6 +122,7 @@ impl CompressionAlgorithm for Packbits { bufwriter.write(&bytes[pending_index..pending_index + bytes_pending as usize])?; } + bufwriter.flush()?; Ok(bytes_written) } } diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 7ca6f60..05f2965 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -354,7 +354,12 @@ impl<'a, W: 'a + Write + Seek, T: ColorType, K: TiffKind, D: Compression> // Limit the strip size to prevent potential memory and security issues. // Also keep the multiple strip handling 'oiled' - let rows_per_strip = (1_000_000 + row_bytes - 1) / row_bytes; + let rows_per_strip = { + match D::COMPRESSION_METHOD { + crate::tags::CompressionMethod::PackBits => 1, // Each row must be packed separately. Do not compress across row boundaries + _ => (1_000_000 + row_bytes - 1) / row_bytes, + } + }; let strip_count = (u64::from(height) + rows_per_strip - 1) / rows_per_strip; From 6f89033fd3211be213e4ec232f813aeb3ef23d1e Mon Sep 17 00:00:00 2001 From: Pretorer <39985339+Pretorer@users.noreply.github.com> Date: Tue, 11 Jan 2022 15:51:34 +0100 Subject: [PATCH 2/2] moved namespace qualifier --- src/encoder/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/encoder/mod.rs b/src/encoder/mod.rs index 05f2965..9886ae7 100644 --- a/src/encoder/mod.rs +++ b/src/encoder/mod.rs @@ -12,7 +12,7 @@ use std::{ use crate::{ error::TiffResult, - tags::{ResolutionUnit, Tag}, + tags::{CompressionMethod, ResolutionUnit, Tag}, }; pub mod colortype; @@ -356,7 +356,7 @@ impl<'a, W: 'a + Write + Seek, T: ColorType, K: TiffKind, D: Compression> // Also keep the multiple strip handling 'oiled' let rows_per_strip = { match D::COMPRESSION_METHOD { - crate::tags::CompressionMethod::PackBits => 1, // Each row must be packed separately. Do not compress across row boundaries + CompressionMethod::PackBits => 1, // Each row must be packed separately. Do not compress across row boundaries _ => (1_000_000 + row_bytes - 1) / row_bytes, } };