diff options
Diffstat (limited to 'wr/write-tiff.c')
-rw-r--r-- | wr/write-tiff.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/wr/write-tiff.c b/wr/write-tiff.c new file mode 100644 index 0000000..9d4910e --- /dev/null +++ b/wr/write-tiff.c @@ -0,0 +1,60 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <inttypes.h> +#include <tiffio.h> + +#include "readers.h" +#include "writers.h" +#include "viewer.h" + +/* ---------------------------------------------------------------------- */ +/* save */ + +static int +tiff_write(FILE *fp, struct ida_image *img) +{ + TIFF *TiffHndl; + tdata_t buf; + unsigned int y; + + TiffHndl = TIFFFdOpen(fileno(fp),"42.tiff","w"); + if (TiffHndl == NULL) + return -1; + TIFFSetField(TiffHndl, TIFFTAG_IMAGEWIDTH, img->i.width); + TIFFSetField(TiffHndl, TIFFTAG_IMAGELENGTH, img->i.height); + TIFFSetField(TiffHndl, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(TiffHndl, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); + TIFFSetField(TiffHndl, TIFFTAG_BITSPERSAMPLE, 8); + TIFFSetField(TiffHndl, TIFFTAG_SAMPLESPERPIXEL, 3); + TIFFSetField(TiffHndl, TIFFTAG_ROWSPERSTRIP, 2); + TIFFSetField(TiffHndl, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); +#if 0 /* fixme: make this configureable */ + TIFFSetField(TiffHndl, TIFFTAG_COMPRESSION, COMPRESSION_LZW); + TIFFSetField(TiffHndl, TIFFTAG_PREDICTOR, 2); +#endif + if (img->i.dpi) { + float dpi = img->i.dpi; + TIFFSetField(TiffHndl, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); + TIFFSetField(TiffHndl, TIFFTAG_XRESOLUTION, dpi); + TIFFSetField(TiffHndl, TIFFTAG_YRESOLUTION, dpi); + } + + for (y = 0; y < img->i.height; y++) { + buf = img->data + 3*img->i.width*y; + TIFFWriteScanline(TiffHndl, buf, y, 0); + } + TIFFClose(TiffHndl); + return 0; +} + +static struct ida_writer tiff_writer = { + label: "TIFF", + ext: { "tif", "tiff", NULL}, + write: tiff_write, +}; + +static void __init init_wr(void) +{ + write_register(&tiff_writer); +} |