diff options
Diffstat (limited to 'tiff/tools/raw2tiff.c')
-rw-r--r-- | tiff/tools/raw2tiff.c | 647 |
1 files changed, 0 insertions, 647 deletions
diff --git a/tiff/tools/raw2tiff.c b/tiff/tools/raw2tiff.c deleted file mode 100644 index 17eb0e4..0000000 --- a/tiff/tools/raw2tiff.c +++ /dev/null @@ -1,647 +0,0 @@ -/* $Id: raw2tiff.c,v 1.23.2.1 2010-06-08 18:50:44 bfriesen Exp $ - * - * Project: libtiff tools - * Purpose: Convert raw byte sequences in TIFF images - * Author: Andrey Kiselev, dron@ak4719.spb.edu - * - ****************************************************************************** - * Copyright (c) 2002, Andrey Kiselev <dron@ak4719.spb.edu> - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#include "tif_config.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <math.h> -#include <ctype.h> - -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif - -#if HAVE_FCNTL_H -# include <fcntl.h> -#endif - -#if HAVE_SYS_TYPES_H -# include <sys/types.h> -#endif - -#if HAVE_IO_H -# include <io.h> -#endif - -#include "tiffio.h" - -#ifndef HAVE_GETOPT -extern int getopt(int, char**, char*); -#endif - -#ifndef O_BINARY -# define O_BINARY 0 -#endif - -typedef enum { - PIXEL, - BAND -} InterleavingType; - -static uint16 compression = (uint16) -1; -static int jpegcolormode = JPEGCOLORMODE_RGB; -static int quality = 75; /* JPEG quality */ -static uint16 predictor = 0; - -static void swapBytesInScanline(void *, uint32, TIFFDataType); -static int guessSize(int, TIFFDataType, off_t, uint32, int, - uint32 *, uint32 *); -static double correlation(void *, void *, uint32, TIFFDataType); -static void usage(void); -static int processCompressOptions(char*); - -int -main(int argc, char* argv[]) -{ - uint32 width = 0, length = 0, linebytes, bufsize; - uint32 nbands = 1; /* number of bands in input image*/ - off_t hdr_size = 0; /* size of the header to skip */ - TIFFDataType dtype = TIFF_BYTE; - int16 depth = 1; /* bytes per pixel in input image */ - int swab = 0; /* byte swapping flag */ - InterleavingType interleaving = 0; /* interleaving type flag */ - uint32 rowsperstrip = (uint32) -1; - uint16 photometric = PHOTOMETRIC_MINISBLACK; - uint16 config = PLANARCONFIG_CONTIG; - uint16 fillorder = FILLORDER_LSB2MSB; - int fd; - char *outfilename = NULL; - TIFF *out; - - uint32 row, col, band; - int c; - unsigned char *buf = NULL, *buf1 = NULL; - extern int optind; - extern char* optarg; - - while ((c = getopt(argc, argv, "c:r:H:w:l:b:d:LMp:si:o:h")) != -1) { - switch (c) { - case 'c': /* compression scheme */ - if (!processCompressOptions(optarg)) - usage(); - break; - case 'r': /* rows/strip */ - rowsperstrip = atoi(optarg); - break; - case 'H': /* size of input image file header */ - hdr_size = atoi(optarg); - break; - case 'w': /* input image width */ - width = atoi(optarg); - break; - case 'l': /* input image length */ - length = atoi(optarg); - break; - case 'b': /* number of bands in input image */ - nbands = atoi(optarg); - break; - case 'd': /* type of samples in input image */ - if (strncmp(optarg, "byte", 4) == 0) - dtype = TIFF_BYTE; - else if (strncmp(optarg, "short", 5) == 0) - dtype = TIFF_SHORT; - else if (strncmp(optarg, "long", 4) == 0) - dtype = TIFF_LONG; - else if (strncmp(optarg, "sbyte", 5) == 0) - dtype = TIFF_SBYTE; - else if (strncmp(optarg, "sshort", 6) == 0) - dtype = TIFF_SSHORT; - else if (strncmp(optarg, "slong", 5) == 0) - dtype = TIFF_SLONG; - else if (strncmp(optarg, "float", 5) == 0) - dtype = TIFF_FLOAT; - else if (strncmp(optarg, "double", 6) == 0) - dtype = TIFF_DOUBLE; - else - dtype = TIFF_BYTE; - depth = TIFFDataWidth(dtype); - break; - case 'L': /* input has lsb-to-msb fillorder */ - fillorder = FILLORDER_LSB2MSB; - break; - case 'M': /* input has msb-to-lsb fillorder */ - fillorder = FILLORDER_MSB2LSB; - break; - case 'p': /* photometric interpretation */ - if (strncmp(optarg, "miniswhite", 10) == 0) - photometric = PHOTOMETRIC_MINISWHITE; - else if (strncmp(optarg, "minisblack", 10) == 0) - photometric = PHOTOMETRIC_MINISBLACK; - else if (strncmp(optarg, "rgb", 3) == 0) - photometric = PHOTOMETRIC_RGB; - else if (strncmp(optarg, "cmyk", 4) == 0) - photometric = PHOTOMETRIC_SEPARATED; - else if (strncmp(optarg, "ycbcr", 5) == 0) - photometric = PHOTOMETRIC_YCBCR; - else if (strncmp(optarg, "cielab", 6) == 0) - photometric = PHOTOMETRIC_CIELAB; - else if (strncmp(optarg, "icclab", 6) == 0) - photometric = PHOTOMETRIC_ICCLAB; - else if (strncmp(optarg, "itulab", 6) == 0) - photometric = PHOTOMETRIC_ITULAB; - else - photometric = PHOTOMETRIC_MINISBLACK; - break; - case 's': /* do we need to swap bytes? */ - swab = 1; - break; - case 'i': /* type of interleaving */ - if (strncmp(optarg, "pixel", 4) == 0) - interleaving = PIXEL; - else if (strncmp(optarg, "band", 6) == 0) - interleaving = BAND; - else - interleaving = 0; - break; - case 'o': - outfilename = optarg; - break; - case 'h': - usage(); - default: - break; - } - } - - if (argc - optind < 2) - usage(); - - fd = open(argv[optind], O_RDONLY|O_BINARY, 0); - if (fd < 0) { - fprintf(stderr, "%s: %s: Cannot open input file.\n", - argv[0], argv[optind]); - return (-1); - } - - if (guessSize(fd, dtype, hdr_size, nbands, swab, &width, &length) < 0) - return 1; - - if (outfilename == NULL) - outfilename = argv[optind+1]; - out = TIFFOpen(outfilename, "w"); - if (out == NULL) { - fprintf(stderr, "%s: %s: Cannot open file for output.\n", - argv[0], outfilename); - return (-1); - } - TIFFSetField(out, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField(out, TIFFTAG_IMAGELENGTH, length); - TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, nbands); - TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, depth * 8); - TIFFSetField(out, TIFFTAG_FILLORDER, fillorder); - TIFFSetField(out, TIFFTAG_PLANARCONFIG, config); - TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photometric); - switch (dtype) { - case TIFF_BYTE: - case TIFF_SHORT: - case TIFF_LONG: - TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); - break; - case TIFF_SBYTE: - case TIFF_SSHORT: - case TIFF_SLONG: - TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); - break; - case TIFF_FLOAT: - case TIFF_DOUBLE: - TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); - break; - default: - TIFFSetField(out, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_VOID); - break; - } - if (compression == (uint16) -1) - compression = COMPRESSION_PACKBITS; - TIFFSetField(out, TIFFTAG_COMPRESSION, compression); - switch (compression) { - case COMPRESSION_JPEG: - if (photometric == PHOTOMETRIC_RGB - && jpegcolormode == JPEGCOLORMODE_RGB) - photometric = PHOTOMETRIC_YCBCR; - TIFFSetField(out, TIFFTAG_JPEGQUALITY, quality); - TIFFSetField(out, TIFFTAG_JPEGCOLORMODE, jpegcolormode); - break; - case COMPRESSION_LZW: - case COMPRESSION_DEFLATE: - if (predictor != 0) - TIFFSetField(out, TIFFTAG_PREDICTOR, predictor); - break; - } - switch(interleaving) { - case BAND: /* band interleaved data */ - linebytes = width * depth; - buf = (unsigned char *)_TIFFmalloc(linebytes); - break; - case PIXEL: /* pixel interleaved data */ - default: - linebytes = width * nbands * depth; - break; - } - bufsize = width * nbands * depth; - buf1 = (unsigned char *)_TIFFmalloc(bufsize); - - rowsperstrip = TIFFDefaultStripSize(out, rowsperstrip); - if (rowsperstrip > length) { - rowsperstrip = length; - } - TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, rowsperstrip ); - - lseek(fd, hdr_size, SEEK_SET); /* Skip the file header */ - for (row = 0; row < length; row++) { - switch(interleaving) { - case BAND: /* band interleaved data */ - for (band = 0; band < nbands; band++) { - lseek(fd, - hdr_size + (length*band+row)*linebytes, - SEEK_SET); - if (read(fd, buf, linebytes) < 0) { - fprintf(stderr, - "%s: %s: scanline %lu: Read error.\n", - argv[0], argv[optind], - (unsigned long) row); - break; - } - if (swab) /* Swap bytes if needed */ - swapBytesInScanline(buf, width, dtype); - for (col = 0; col < width; col++) - memcpy(buf1 + (col*nbands+band)*depth, - buf + col * depth, depth); - } - break; - case PIXEL: /* pixel interleaved data */ - default: - if (read(fd, buf1, bufsize) < 0) { - fprintf(stderr, - "%s: %s: scanline %lu: Read error.\n", - argv[0], argv[optind], - (unsigned long) row); - break; - } - if (swab) /* Swap bytes if needed */ - swapBytesInScanline(buf1, width, dtype); - break; - } - - if (TIFFWriteScanline(out, buf1, row, 0) < 0) { - fprintf(stderr, "%s: %s: scanline %lu: Write error.\n", - argv[0], outfilename, (unsigned long) row); - break; - } - } - if (buf) - _TIFFfree(buf); - if (buf1) - _TIFFfree(buf1); - TIFFClose(out); - return (0); -} - -static void -swapBytesInScanline(void *buf, uint32 width, TIFFDataType dtype) -{ - switch (dtype) { - case TIFF_SHORT: - case TIFF_SSHORT: - TIFFSwabArrayOfShort((uint16*)buf, - (unsigned long)width); - break; - case TIFF_LONG: - case TIFF_SLONG: - TIFFSwabArrayOfLong((uint32*)buf, - (unsigned long)width); - break; - /* case TIFF_FLOAT: */ /* FIXME */ - case TIFF_DOUBLE: - TIFFSwabArrayOfDouble((double*)buf, - (unsigned long)width); - break; - default: - break; - } -} - -static int -guessSize(int fd, TIFFDataType dtype, off_t hdr_size, uint32 nbands, - int swab, uint32 *width, uint32 *length) -{ - const float longt = 40.0; /* maximum possible height/width ratio */ - char *buf1, *buf2; - struct stat filestat; - uint32 w, h, scanlinesize, imagesize; - uint32 depth = TIFFDataWidth(dtype); - float cor_coef = 0, tmp; - - fstat(fd, &filestat); - - if (filestat.st_size < hdr_size) { - fprintf(stderr, "Too large header size specified.\n"); - return -1; - } - - imagesize = (filestat.st_size - hdr_size) / nbands / depth; - - if (*width != 0 && *length == 0) { - fprintf(stderr, "Image height is not specified.\n"); - - *length = imagesize / *width; - - fprintf(stderr, "Height is guessed as %lu.\n", - (unsigned long)*length); - - return 1; - } else if (*width == 0 && *length != 0) { - fprintf(stderr, "Image width is not specified.\n"); - - *width = imagesize / *length; - - fprintf(stderr, "Width is guessed as %lu.\n", - (unsigned long)*width); - - return 1; - } else if (*width == 0 && *length == 0) { - fprintf(stderr, "Image width and height are not specified.\n"); - - for (w = (uint32) sqrt(imagesize / longt); - w < sqrt(imagesize * longt); - w++) { - if (imagesize % w == 0) { - scanlinesize = w * depth; - buf1 = _TIFFmalloc(scanlinesize); - buf2 = _TIFFmalloc(scanlinesize); - h = imagesize / w; - lseek(fd, hdr_size + (int)(h/2)*scanlinesize, - SEEK_SET); - read(fd, buf1, scanlinesize); - read(fd, buf2, scanlinesize); - if (swab) { - swapBytesInScanline(buf1, w, dtype); - swapBytesInScanline(buf2, w, dtype); - } - tmp = (float) fabs(correlation(buf1, buf2, - w, dtype)); - if (tmp > cor_coef) { - cor_coef = tmp; - *width = w, *length = h; - } - - _TIFFfree(buf1); - _TIFFfree(buf2); - } - } - - fprintf(stderr, - "Width is guessed as %lu, height is guessed as %lu.\n", - (unsigned long)*width, (unsigned long)*length); - - return 1; - } else { - if (filestat.st_size<(off_t)(hdr_size+(*width)*(*length)*nbands*depth)) { - fprintf(stderr, "Input file too small.\n"); - return -1; - } - } - - return 1; -} - -/* Calculate correlation coefficient between two numeric vectors */ -static double -correlation(void *buf1, void *buf2, uint32 n_elem, TIFFDataType dtype) -{ - double X, Y, M1 = 0.0, M2 = 0.0, D1 = 0.0, D2 = 0.0, K = 0.0; - uint32 i; - - switch (dtype) { - case TIFF_BYTE: - default: - for (i = 0; i < n_elem; i++) { - X = ((unsigned char *)buf1)[i]; - Y = ((unsigned char *)buf2)[i]; - M1 += X, M2 += Y; - D1 += X * X, D2 += Y * Y; - K += X * Y; - } - break; - case TIFF_SBYTE: - for (i = 0; i < n_elem; i++) { - X = ((signed char *)buf1)[i]; - Y = ((signed char *)buf2)[i]; - M1 += X, M2 += Y; - D1 += X * X, D2 += Y * Y; - K += X * Y; - } - break; - case TIFF_SHORT: - for (i = 0; i < n_elem; i++) { - X = ((uint16 *)buf1)[i]; - Y = ((uint16 *)buf2)[i]; - M1 += X, M2 += Y; - D1 += X * X, D2 += Y * Y; - K += X * Y; - } - break; - case TIFF_SSHORT: - for (i = 0; i < n_elem; i++) { - X = ((int16 *)buf1)[i]; - Y = ((int16 *)buf2)[i]; - M1 += X, M2 += Y; - D1 += X * X, D2 += Y * Y; - K += X * Y; - } - break; - case TIFF_LONG: - for (i = 0; i < n_elem; i++) { - X = ((uint32 *)buf1)[i]; - Y = ((uint32 *)buf2)[i]; - M1 += X, M2 += Y; - D1 += X * X, D2 += Y * Y; - K += X * Y; - } - break; - case TIFF_SLONG: - for (i = 0; i < n_elem; i++) { - X = ((int32 *)buf1)[i]; - Y = ((int32 *)buf2)[i]; - M1 += X, M2 += Y; - D1 += X * X, D2 += Y * Y; - K += X * Y; - } - break; - case TIFF_FLOAT: - for (i = 0; i < n_elem; i++) { - X = ((float *)buf1)[i]; - Y = ((float *)buf2)[i]; - M1 += X, M2 += Y; - D1 += X * X, D2 += Y * Y; - K += X * Y; - } - break; - case TIFF_DOUBLE: - for (i = 0; i < n_elem; i++) { - X = ((double *)buf1)[i]; - Y = ((double *)buf2)[i]; - M1 += X, M2 += Y; - D1 += X * X, D2 += Y * Y; - K += X * Y; - } - break; - } - - M1 /= n_elem; - M2 /= n_elem; - D1 -= M1 * M1 * n_elem; - D2 -= M2 * M2 * n_elem; - K = (K - M1 * M2 * n_elem) / sqrt(D1 * D2); - - return K; -} - -static int -processCompressOptions(char* opt) -{ - if (strcmp(opt, "none") == 0) - compression = COMPRESSION_NONE; - else if (strcmp(opt, "packbits") == 0) - compression = COMPRESSION_PACKBITS; - else if (strncmp(opt, "jpeg", 4) == 0) { - char* cp = strchr(opt, ':'); - - compression = COMPRESSION_JPEG; - while( cp ) - { - if (isdigit((int)cp[1])) - quality = atoi(cp+1); - else if (cp[1] == 'r' ) - jpegcolormode = JPEGCOLORMODE_RAW; - else - usage(); - - cp = strchr(cp+1,':'); - } - } else if (strncmp(opt, "lzw", 3) == 0) { - char* cp = strchr(opt, ':'); - if (cp) - predictor = atoi(cp+1); - compression = COMPRESSION_LZW; - } else if (strncmp(opt, "zip", 3) == 0) { - char* cp = strchr(opt, ':'); - if (cp) - predictor = atoi(cp+1); - compression = COMPRESSION_DEFLATE; - } else - return (0); - return (1); -} - -static char* stuff[] = { -"raw2tiff --- tool for converting raw byte sequences in TIFF images", -"usage: raw2tiff [options] input.raw output.tif", -"where options are:", -" -L input data has LSB2MSB bit order (default)", -" -M input data has MSB2LSB bit order", -" -r # make each strip have no more than # rows", -" -H # size of input image file header in bytes (0 by default)", -" -w # width of input image in pixels", -" -l # length of input image in lines", -" -b # number of bands in input image (1 by default)", -"", -" -d data_type type of samples in input image", -"where data_type may be:", -" byte 8-bit unsigned integer (default)", -" short 16-bit unsigned integer", -" long 32-bit unsigned integer", -" sbyte 8-bit signed integer", -" sshort 16-bit signed integer", -" slong 32-bit signed integer", -" float 32-bit IEEE floating point", -" double 64-bit IEEE floating point", -"", -" -p photo photometric interpretation (color space) of the input image", -"where photo may be:", -" miniswhite white color represented with 0 value", -" minisblack black color represented with 0 value (default)", -" rgb image has RGB color model", -" cmyk image has CMYK (separated) color model", -" ycbcr image has YCbCr color model", -" cielab image has CIE L*a*b color model", -" icclab image has ICC L*a*b color model", -" itulab image has ITU L*a*b color model", -"", -" -s swap bytes fetched from input file", -"", -" -i config type of samples interleaving in input image", -"where config may be:", -" pixel pixel interleaved data (default)", -" band band interleaved data", -"", -" -c lzw[:opts] compress output with Lempel-Ziv & Welch encoding", -" -c zip[:opts] compress output with deflate encoding", -" -c jpeg[:opts] compress output with JPEG encoding", -" -c packbits compress output with packbits encoding", -" -c none use no compression algorithm on output", -"", -"JPEG options:", -" # set compression quality level (0-100, default 75)", -" r output color image as RGB rather than YCbCr", -"For example, -c jpeg:r:50 to get JPEG-encoded RGB data with 50% comp. quality", -"", -"LZW and deflate options:", -" # set predictor value", -"For example, -c lzw:2 to get LZW-encoded data with horizontal differencing", -" -o out.tif write output to out.tif", -" -h this help message", -NULL -}; - -static void -usage(void) -{ - char buf[BUFSIZ]; - int i; - - setbuf(stderr, buf); - fprintf(stderr, "%s\n\n", TIFFGetVersion()); - for (i = 0; stuff[i] != NULL; i++) - fprintf(stderr, "%s\n", stuff[i]); - exit(-1); -} - -/* vim: set ts=8 sts=8 sw=8 noet: */ -/* - * Local Variables: - * mode: c - * c-basic-offset: 8 - * fill-column: 78 - * End: - */ |