Merge pull request #62 from onnotechno/multipage_image_patch
Multipage image patch
This commit is contained in:
3 files changed
+38
-3
No files matched your search
+5
-2
@@ -1,6 +1,7 @@
|
|||||||
use byteorder::NativeEndian;
|
use byteorder::NativeEndian;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::io::{Seek, Write};
|
use std::io::{Seek, Write};
|
||||||
|
use std::mem;
|
||||||
|
|
||||||
use decoder::ifd::{self, Tag};
|
use decoder::ifd::{self, Tag};
|
||||||
use error::{TiffError, TiffFormatError, TiffResult};
|
use error::{TiffError, TiffFormatError, TiffResult};
|
||||||
@@ -351,6 +352,8 @@ impl<W: Write + Seek> TiffEncoder<W> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
NativeEndian::write_header(&mut encoder.writer)?;
|
NativeEndian::write_header(&mut encoder.writer)?;
|
||||||
|
// blank the IFD offset location
|
||||||
|
encoder.writer.write_u32(0)?;
|
||||||
|
|
||||||
Ok(encoder)
|
Ok(encoder)
|
||||||
}
|
}
|
||||||
@@ -417,9 +420,9 @@ pub struct DirectoryEncoder<'a, W: 'a + Write + Seek> {
|
|||||||
|
|
||||||
impl<'a, W: 'a + Write + Seek> DirectoryEncoder<'a, W> {
|
impl<'a, W: 'a + Write + Seek> DirectoryEncoder<'a, W> {
|
||||||
fn new(writer: &'a mut TiffWriter<W>) -> TiffResult<DirectoryEncoder<'a, W>> {
|
fn new(writer: &'a mut TiffWriter<W>) -> TiffResult<DirectoryEncoder<'a, W>> {
|
||||||
|
// the previous word is the IFD offset position
|
||||||
|
let ifd_pointer_pos = writer.offset() - mem::size_of::<u32>() as u64;
|
||||||
writer.pad_word_boundary()?;
|
writer.pad_word_boundary()?;
|
||||||
let ifd_pointer_pos = writer.offset();
|
|
||||||
writer.write_u32(0)?;
|
|
||||||
Ok(DirectoryEncoder {
|
Ok(DirectoryEncoder {
|
||||||
writer,
|
writer,
|
||||||
dropped: false,
|
dropped: false,
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ impl<W: Write> TiffWriter<W> {
|
|||||||
let padding = [0, 0, 0];
|
let padding = [0, 0, 0];
|
||||||
let padd_len = 4 - (self.offset % 4);
|
let padd_len = 4 - (self.offset % 4);
|
||||||
self.writer.write_all(&padding[..padd_len as usize])?;
|
self.writer.write_all(&padding[..padd_len as usize])?;
|
||||||
|
self.offset += padd_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
+32
-1
@@ -260,4 +260,35 @@ fn test_signed() {
|
|||||||
assert_eq!(decoder.get_tag(Tag::Unknown(65030)).unwrap().into_i32_vec().unwrap(), [-1, 100]);
|
assert_eq!(decoder.get_tag(Tag::Unknown(65030)).unwrap().into_i32_vec().unwrap(), [-1, 100]);
|
||||||
assert_eq!(decoder.get_tag(Tag::Unknown(65031)).unwrap().into_i32_vec().unwrap(), [-1_i32, 100, 2, 100]);
|
assert_eq!(decoder.get_tag(Tag::Unknown(65031)).unwrap().into_i32_vec().unwrap(), [-1_i32, 100, 2, 100]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
/// check multipage image handling
|
||||||
|
fn test_multipage_image() {
|
||||||
|
let mut img_file = Cursor::new(Vec::new());
|
||||||
|
|
||||||
|
{
|
||||||
|
// first create a multipage image with 2 images
|
||||||
|
let mut img_encoder = TiffEncoder::new(&mut img_file).unwrap();
|
||||||
|
|
||||||
|
// write first grayscale image (2x2 16-bit)
|
||||||
|
let img1: Vec<u16> = [1, 2, 3, 4].to_vec();
|
||||||
|
img_encoder.write_image::<colortype::Gray16>(2, 2, &img1[..]);
|
||||||
|
// write second grayscale image (3x3 8-bit)
|
||||||
|
let img2: Vec<u8> = [9, 8, 7, 6, 5, 4, 3, 2, 1].to_vec();
|
||||||
|
img_encoder.write_image::<colortype::Gray8>(3, 3, &img2[..]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// seek to the beginning of the file, so that it can be decoded
|
||||||
|
img_file.seek(SeekFrom::Start(0)).unwrap();
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut img_decoder = Decoder::new(&mut img_file).unwrap();
|
||||||
|
|
||||||
|
// check the dimensions of the image in the first page
|
||||||
|
assert_eq!(img_decoder.dimensions().unwrap(), (2, 2));
|
||||||
|
img_decoder.next_image().unwrap();
|
||||||
|
// check the dimensions of the image in the second page
|
||||||
|
assert_eq!(img_decoder.dimensions().unwrap(), (3, 3));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user