tiff-forge

A fork of the tiff-encoder crate which supports both TIFF and BigTIFF files with the desired IFDs and entries.
This crate allows to create any hierarchy of IFDs and to add any
tags with any values to each. It does so while avoiding that
the user needs to worry about the position of each structure in the
file and to point to it with the correct offset.
The main structure of this crate, used to actually write the TIFF
file, are the TiffFile and BigTiffFile structs. This structure writes
the file in Little Endian by default (but that can be changed) and requires an IfdChain.
This IfdChain consists of the first of the file, the one it points to (if any),
and so on. Each Ifd or BigIfd have one or more entries, which are represented
by a pair of FileTag and FieldValues
TIFF Example
Creating a 256x256 bilevel image with every pixel black.
#[macro_use]
extern crate tiff_forge;
use tiff_forge::prelude::*;
use tiff_forge::ifd::tags;
fn main() {
let image_data = vec![0x00; 8192];
TiffFile::new(
Ifd::new()
.with_entry(tags::PhotometricInterpretation, SHORT![1]) .with_entry(tags::Compression, SHORT![1])
.with_entry(tags::ImageLength, LONG![256])
.with_entry(tags::ImageWidth, LONG![256])
.with_entry(tags::ResolutionUnit, SHORT![1]) .with_entry(tags::XResolution, RATIONAL![(1, 1)])
.with_entry(tags::YResolution, RATIONAL![(1, 1)])
.with_entry(tags::RowsPerStrip, LONG![256]) .with_entry(tags::StripByteCounts, LONG![8192])
.with_entry(tags::StripOffsets, ByteBlock::single(image_data))
.single() ).write_to("example.tif").unwrap();
}
BigTIFF Example
Creating a large, bilevel BigTIFF with every pixel black
#[macro_use]
extern crate tiff_forge;
use tiff_forge::prelude::*;
use tiff_forge::ifd::tags;
fn main() {
let image_data = vec![0x00; 11250000000];
BigTiffFile::new(
BigIfd::new()
.with_entry(tags::PhotometricInterpretation, SHORT![1]) .with_entry(tags::Compression, SHORT![1])
.with_entry(tags::ImageLength, LONG![300000])
.with_entry(tags::ImageWidth, LONG![300000])
.with_entry(tags::ResolutionUnit, SHORT![1]) .with_entry(tags::XResolution, RATIONAL![(1, 1)])
.with_entry(tags::YResolution, RATIONAL![(1, 1)])
.with_entry(tags::RowsPerStrip, LONG![300000]) .with_entry(tags::StripByteCounts, LONG![11250000000])
.with_entry(tags::StripOffsets, ByteBlock::single(image_data))
.single() ).write_to("example_big.tif").unwrap();
}