⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tiffinfo.c

📁 tiff文件开发库
💻 C
字号:
/* $Header: /cvsroot/osrs/libtiff/tools/tiffinfo.c,v 1.2 2003/03/12 14:05:06 dron Exp $ *//* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * 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 <stdio.h>#include <stdlib.h>#include <string.h>#include "tiffio.h"#define	streq(a,b)	(strcmp(a,b) == 0)int	showdata = 0;			/* show data */int	rawdata = 0;			/* show raw/decoded data */int	showwords = 0;			/* show data as bytes/words */int	readdata = 0;			/* read data in file */int	stoponerr = 1;			/* stop on first read error */static	void usage(void);static	void tiffinfo(TIFF*, uint16, long);intmain(int argc, char* argv[]){	int dirnum = -1, multiplefiles, c;	uint16 order = 0;	TIFF* tif;	extern int optind;	extern char* optarg;	long flags = 0;	uint32 diroff = 0;	int chopstrips = 0;		/* disable strip chopping */	while ((c = getopt(argc, argv, "f:o:cdDSjlmrsvwz0123456789")) != -1)		switch (c) {		case '0': case '1': case '2': case '3':		case '4': case '5': case '6': case '7':		case '8': case '9':			dirnum = atoi(&argv[optind-1][1]);			break;		case 'd':			showdata++;			/* fall thru... */		case 'D':			readdata++;			break;		case 'c':			flags |= TIFFPRINT_COLORMAP | TIFFPRINT_CURVES;			break;		case 'f':		/* fill order */			if (streq(optarg, "lsb2msb"))				order = FILLORDER_LSB2MSB;			else if (streq(optarg, "msb2lsb"))				order = FILLORDER_MSB2LSB;			else				usage();			break;		case 'i':			stoponerr = 0;			break;		case 'o':			diroff = strtoul(optarg, NULL, 0);			break;		case 'j':			flags |= TIFFPRINT_JPEGQTABLES |				 TIFFPRINT_JPEGACTABLES |				 TIFFPRINT_JPEGDCTABLES;			break;		case 'r':			rawdata = 1;			break;		case 's':			flags |= TIFFPRINT_STRIPS;			break;		case 'w':			showwords = 1;			break;		case 'z':			chopstrips = 1;			break;		case '?':			usage();			/*NOTREACHED*/		}	if (optind >= argc)		usage();	multiplefiles = (argc - optind > 1);	for (; optind < argc; optind++) {		if (multiplefiles)			printf("%s:\n", argv[optind]);		tif = TIFFOpen(argv[optind], chopstrips ? "rC" : "rc");		if (tif != NULL) {			if (dirnum != -1) {				if (TIFFSetDirectory(tif, dirnum))					tiffinfo(tif, order, flags);			} else if (diroff != 0) {				if (TIFFSetSubDirectory(tif, diroff))					tiffinfo(tif, order, flags);			} else {				do					tiffinfo(tif, order, flags);				while (TIFFReadDirectory(tif));			}			TIFFClose(tif);		}	}	return (0);}char* stuff[] = {"usage: tiffinfo [options] input...","where options are:"," -D		read data"," -i		ignore read errors"," -c		display data for grey/color response curve or colormap"," -d		display raw/decoded image data"," -f lsb2msb	force lsb-to-msb FillOrder for input"," -f msb2lsb	force msb-to-lsb FillOrder for input"," -j		show JPEG tables"," -o offset	set initial directory offset"," -r		read/display raw image data instead of decoded data"," -s		display strip offsets and byte counts"," -w		display raw data in words rather than bytes"," -z		enable strip chopping"," -#		set initial directory (first directory is # 0)",NULL};static voidusage(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);}static voidShowStrip(tstrip_t strip, unsigned char* pp, uint32 nrow, tsize_t scanline){	register tsize_t cc;	printf("Strip %lu:\n", (unsigned long) strip);	while (nrow-- > 0) {		for (cc = 0; cc < scanline; cc++) {			printf(" %02x", *pp++);			if (((cc+1) % 24) == 0)				putchar('\n');		}		putchar('\n');	}}voidTIFFReadContigStripData(TIFF* tif){	unsigned char *buf;	tsize_t scanline = TIFFScanlineSize(tif);	buf = (unsigned char *)_TIFFmalloc(TIFFStripSize(tif));	if (buf) {		uint32 row, h;		uint32 rowsperstrip = (uint32)-1;		TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);		TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);		for (row = 0; row < h; row += rowsperstrip) {			uint32 nrow = (row+rowsperstrip > h ?			    h-row : rowsperstrip);			tstrip_t strip = TIFFComputeStrip(tif, row, 0);			if (TIFFReadEncodedStrip(tif, strip, buf, nrow*scanline) < 0) {				if (stoponerr)					break;			} else if (showdata)				ShowStrip(strip, buf, nrow, scanline);		}		_TIFFfree(buf);	}}voidTIFFReadSeparateStripData(TIFF* tif){	unsigned char *buf;	tsize_t scanline = TIFFScanlineSize(tif);	buf = (unsigned char *)_TIFFmalloc(TIFFStripSize(tif));	if (buf) {		uint32 row, h;		uint32 rowsperstrip = (uint32)-1;		tsample_t s, samplesperpixel;		TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);		TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);		TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);		for (row = 0; row < h; row += rowsperstrip) {			for (s = 0; s < samplesperpixel; s++) {				uint32 nrow = (row+rowsperstrip > h ?				    h-row : rowsperstrip);				tstrip_t strip = TIFFComputeStrip(tif, row, s);				if (TIFFReadEncodedStrip(tif, strip, buf, nrow*scanline) < 0) {					if (stoponerr)						break;				} else if (showdata)					ShowStrip(strip, buf, nrow, scanline);			}		}		_TIFFfree(buf);	}}static voidShowTile(uint32 row, uint32 col, tsample_t sample,    unsigned char* pp, uint32 nrow, uint32 rowsize){	register tsize_t cc;	printf("Tile (%lu,%lu", (unsigned long) row, (unsigned long) col);	if (sample != (tsample_t) -1)		printf(",%u", sample);	printf("):\n");	while (nrow-- > 0) {		for (cc = 0; cc < rowsize; cc++) {			printf(" %02x", *pp++);			if (((cc+1) % 24) == 0)				putchar('\n');		}		putchar('\n');	}}voidTIFFReadContigTileData(TIFF* tif){	unsigned char *buf;	tsize_t rowsize = TIFFTileRowSize(tif);	buf = (unsigned char *)_TIFFmalloc(TIFFTileSize(tif));	if (buf) {		uint32 tw, th, w, h;		uint32 row, col;		TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);		TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);		TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);		TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);		for (row = 0; row < h; row += th) {			for (col = 0; col < w; col += tw) {				if (TIFFReadTile(tif, buf, col, row, 0, 0) < 0) {					if (stoponerr)						break;				} else if (showdata)					ShowTile(row, col, (tsample_t) -1, buf, th, rowsize);			}		}		_TIFFfree(buf);	}}voidTIFFReadSeparateTileData(TIFF* tif){	unsigned char *buf;	tsize_t rowsize = TIFFTileRowSize(tif);	buf = (unsigned char *)_TIFFmalloc(TIFFTileSize(tif));	if (buf) {		uint32 tw, th, w, h;		uint32 row, col;		tsample_t s, samplesperpixel;		TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);		TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);		TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);		TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);		TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel);		for (row = 0; row < h; row += th) {			for (col = 0; col < w; col += tw) {				for (s = 0; s < samplesperpixel; s++) {					if (TIFFReadTile(tif, buf, col, row, 0, s) < 0) {						if (stoponerr)							break;					} else if (showdata)						ShowTile(row, col, s, buf, th, rowsize);				}			}		}		_TIFFfree(buf);	}}voidTIFFReadData(TIFF* tif){	uint16 config;	TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &config);	if (TIFFIsTiled(tif)) {		if (config == PLANARCONFIG_CONTIG)			TIFFReadContigTileData(tif);		else			TIFFReadSeparateTileData(tif);	} else {		if (config == PLANARCONFIG_CONTIG)			TIFFReadContigStripData(tif);		else			TIFFReadSeparateStripData(tif);	}}static voidShowRawBytes(unsigned char* pp, uint32 n){	tsize_t i;	for (i = 0; i < n; i++) {		printf(" %02x", *pp++);		if (((i+1) % 24) == 0)			printf("\n ");	}	putchar('\n');}static voidShowRawWords(uint16* pp, uint32 n){	tsize_t i;	for (i = 0; i < n; i++) {		printf(" %04x", *pp++);		if (((i+1) % 15) == 0)			printf("\n ");	}	putchar('\n');}voidTIFFReadRawData(TIFF* tif, int bitrev){	tstrip_t nstrips = TIFFNumberOfStrips(tif);	const char* what = TIFFIsTiled(tif) ? "Tile" : "Strip";	uint32* stripbc;	TIFFGetField(tif, TIFFTAG_STRIPBYTECOUNTS, &stripbc);	if (nstrips > 0) {		tsize_t bufsize = stripbc[0];		tdata_t buf = _TIFFmalloc(bufsize);		tstrip_t s;		for (s = 0; s < nstrips; s++) {			if (stripbc[s] > bufsize) {				buf = _TIFFrealloc(buf, stripbc[s]);				bufsize = stripbc[s];			}			if (buf == NULL) {				fprintf(stderr,				   "Cannot allocate buffer to read strip %lu\n",				    (unsigned long) s);				break;			}			if (TIFFReadRawStrip(tif, s, buf, stripbc[s]) < 0) {				fprintf(stderr, "Error reading strip %lu\n",				    (unsigned long) s);				if (stoponerr)					break;			} else if (showdata) {				if (bitrev) {					TIFFReverseBits(buf, stripbc[s]);					printf("%s %lu: (bit reversed)\n ",					    what, (unsigned long) s);				} else					printf("%s %lu:\n ", what,					    (unsigned long) s);				if (showwords)					ShowRawWords((uint16*) buf, stripbc[s]>>1);				else					ShowRawBytes((unsigned char*) buf, stripbc[s]);			}		}		if (buf != NULL)			_TIFFfree(buf);	}}static voidtiffinfo(TIFF* tif, uint16 order, long flags){	TIFFPrintDirectory(tif, stdout, flags);	if (!readdata)		return;	if (rawdata) {		if (order) {			uint16 o;			TIFFGetFieldDefaulted(tif,			    TIFFTAG_FILLORDER, &o);			TIFFReadRawData(tif, o != order);		} else			TIFFReadRawData(tif, 0);	} else {		if (order)			TIFFSetField(tif, TIFFTAG_FILLORDER, order);		TIFFReadData(tif);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -