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

📄 tif_imageiter.c

📁 非常详尽的传真编解码程序
💻 C
📖 第 1 页 / 共 2 页
字号:
{    TIFF* tif = img->tif;    ImageIterTileContigRoutine callback = img->callback.contig;    uint16 orientation;    uint32 col, row;    uint32 tw, th;    u_char* buf;    int32 fromskew;    uint32 nrow;    buf = (u_char*) _TIFFmalloc(TIFFTileSize(tif));    if (buf == 0) {	TIFFError(TIFFFileName(tif), "No space for tile buffer");	return (0);    }    TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);    TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);    orientation = img->orientation;    for (row = 0; row < h; row += th) {	nrow = (row + th > h ? h - row : th);	for (col = 0; col < w; col += tw) {	    if (TIFFReadTile(tif, buf, col, row, 0, 0) < 0 && img->stoponerr)		break;	    if (col + tw > w) {		/*		 * Tile is clipped horizontally.  Calculate		 * visible portion and skewing factors.		 */		uint32 npix = w - col;		fromskew = tw - npix;		(*callback)(img, udata, col, row, npix, nrow, fromskew, buf);	    } else {		(*callback)(img, udata, col, row, tw, nrow, 0, buf);	    }	}    }    _TIFFfree(buf);    return (1);}/* * Get an tile-organized image that has *	 SamplesPerPixel > 1 *	 PlanarConfiguration separated * We assume that all such images are RGB. */	static intgtTileSeparate(TIFFImageIter* img, void *udata, uint32 w, uint32 h){    TIFF* tif = img->tif;    ImageIterTileSeparateRoutine callback = img->callback.separate;    uint16 orientation;    uint32 col, row;    uint32 tw, th;    u_char* buf;    u_char* r;    u_char* g;    u_char* b;    u_char* a;    tsize_t tilesize;    int32 fromskew;    int alpha = img->alpha;    uint32 nrow;    tilesize = TIFFTileSize(tif);    buf = (u_char*) _TIFFmalloc(4*tilesize);    if (buf == 0) {	TIFFError(TIFFFileName(tif), "No space for tile buffer");	return (0);    }    r = buf;    g = r + tilesize;    b = g + tilesize;    a = b + tilesize;    if (!alpha)	memset(a, 0xff, tilesize);    TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);    TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);    orientation = img->orientation;    for (row = 0; row < h; row += th) {	nrow = (row + th > h ? h - row : th);	for (col = 0; col < w; col += tw) {	    if (TIFFReadTile(tif, r, col, row,0,0) < 0 && img->stoponerr)		break;	    if (TIFFReadTile(tif, g, col, row,0,1) < 0 && img->stoponerr)		break;	    if (TIFFReadTile(tif, b, col, row,0,2) < 0 && img->stoponerr)		break;	    if (alpha && TIFFReadTile(tif,a,col,row,0,3) < 0 && img->stoponerr)		break;	    if (col + tw > w) {		/*		 * Tile is clipped horizontally.  Calculate		 * visible portion and skewing factors.		 */		uint32 npix = w - col;		fromskew = tw - npix;		(*callback)(img, udata, col, row, npix, nrow, fromskew, r, g, b, a);	    } else {		(*callback)(img, udata, col, row, tw, nrow, 0, r, g, b, a);	    }	}    }    _TIFFfree(buf);    return (1);}/* * Get a strip-organized image that has *	PlanarConfiguration contiguous if SamplesPerPixel > 1 * or *	SamplesPerPixel == 1 */	static intgtStripContig(TIFFImageIter* img, void *udata, uint32 w, uint32 h){    TIFF* tif = img->tif;    ImageIterTileContigRoutine callback = img->callback.contig;    uint16 orientation;    uint32 row, nrow;    u_char* buf;    uint32 rowsperstrip;    uint32 imagewidth = img->width;    tsize_t scanline;    int32 fromskew;    buf = (u_char*) _TIFFmalloc(TIFFStripSize(tif));    if (buf == 0) {	TIFFError(TIFFFileName(tif), "No space for strip buffer");	return (0);    }    orientation = img->orientation;    TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);    scanline = TIFFScanlineSize(tif);    fromskew = (w < imagewidth ? imagewidth - w : 0);    for (row = 0; row < h; row += rowsperstrip) {	nrow = (row + rowsperstrip > h ? h - row : rowsperstrip);	if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 0),	    buf, nrow*scanline) < 0 && img->stoponerr)		break;	(*callback)(img, udata, 0, row, w, nrow, fromskew, buf);    }    _TIFFfree(buf);    return (1);}/* * Get a strip-organized image with *	 SamplesPerPixel > 1 *	 PlanarConfiguration separated * We assume that all such images are RGB. */static intgtStripSeparate(TIFFImageIter* img, void *udata, uint32 w, uint32 h){    TIFF* tif = img->tif;    ImageIterTileSeparateRoutine callback = img->callback.separate;    uint16 orientation;    u_char *buf;    u_char *r, *g, *b, *a;    uint32 row, nrow;    tsize_t scanline;    uint32 rowsperstrip;    uint32 imagewidth = img->width;    tsize_t stripsize;    int32 fromskew;    int alpha = img->alpha;    stripsize = TIFFStripSize(tif);    r = buf = (u_char *)_TIFFmalloc(4*stripsize);    if (buf == 0) {	TIFFError(TIFFFileName(tif), "No space for tile buffer");	return (0);    }    g = r + stripsize;    b = g + stripsize;    a = b + stripsize;    if (!alpha)	memset(a, 0xff, stripsize);    orientation = img->orientation;    TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);    scanline = TIFFScanlineSize(tif);    fromskew = (w < imagewidth ? imagewidth - w : 0);    for (row = 0; row < h; row += rowsperstrip) {	nrow = (row + rowsperstrip > h ? h - row : rowsperstrip);	if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 0),	    r, nrow*scanline) < 0 && img->stoponerr)	    break;	if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 1),	    g, nrow*scanline) < 0 && img->stoponerr)	    break;	if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 2),	    b, nrow*scanline) < 0 && img->stoponerr)	    break;	if (alpha &&	    (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, row, 3),	    a, nrow*scanline) < 0 && img->stoponerr))	    break;	(*callback)(img, udata, 0, row, w, nrow, fromskew, r, g, b, a);    }    _TIFFfree(buf);    return (1);}DECLAREContigCallbackFunc(TestContigCallback){    printf("Contig Callback called with x = %d, y = %d, w = %d, h = %d, fromskew = %d\n",	   x, y, w, h, fromskew);}DECLARESepCallbackFunc(TestSepCallback){    printf("Sep Callback called with x = %d, y = %d, w = %d, h = %d, fromskew = %d\n",	   x, y, w, h, fromskew);}#ifdef MAINmain(int argc, char **argv){    char emsg[1024];    TIFFImageIter img;    int ok;    int stop = 1;    TIFF *tif;    unsigned long nx, ny;    unsigned short BitsPerSample, SamplesPerPixel;    int isColorMapped, isPliFile;    unsigned char *ColorMap;    unsigned char *data;    if (argc < 2) {	fprintf(stderr,"usage: %s tiff_file\n",argv[0]);	exit(1);    }    tif = (TIFF *)PLIGetImage(argv[1], (void *) &data, &ColorMap, 			      &nx, &ny, &BitsPerSample, &SamplesPerPixel, 			      &isColorMapped, &isPliFile);    if (tif != NULL) {	if (TIFFImageIterBegin(&img, tif, stop, emsg)) {	    /* Here need to set data and callback function! */	    if (img.isContig) {		img.callback = TestContigCallback;	    } else {		img.callback = TestSepCallback;	    }	    ok = TIFFImageIterGet(&img, NULL, img.width, img.height);	    TIFFImageIterEnd(&img);	} else {	    TIFFError(TIFFFileName(tif), emsg);	}    }    }#endif

⌨️ 快捷键说明

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