如何在c中读取TIFF文件头?

我如何在c中读取tiff文件头?

实际上我想学习TIFF Tag ImageWidth和TIFF Tag ImageLength。

我怎样才能访问这个属性?

http://www.awaresystems.be/imaging/tiff/tifftags/imagewidth.html http://www.awaresystems.be/imaging/tiff/tifftags/imagelength.html

这段代码的c翻译可以帮助我:

https://stackoverflow.com/a/9071933/2079158

我不知道,
试过这样的事情:

#include "stdio.h" #include "stdlib.h" main() { FILE* f = fopen("tifo.tif", "rb"); unsigned char info[500]; fread(info, sizeof(unsigned char), 500, f); long int width = *(long int*)&info[256]; short int height = *(short int*)&info[257]; printf("width : %d \n", width); printf("height : %d \n", height); fclose(f); } 

我能为tiff文件做些什么?

您错误地将“标签ID”(256和257)解释为索引,这将无法正常工作。

您需要在文件中搜索所需的ID,然后提取与每个ID关联的值。

请注意,TIFF没有包含所有信息的“标题”,您需要通过该文件来查找您所追求的内容。

您的代码正在尝试读取带偏移量的标头。 这不是TIFF的工作原理。 它有一个短标题,用于标识“图像文件目录”(IFD)的起始位置。 IFD包含一个或多个条目,每个条目都有一个TAG,用于解释其内容,字段类型,计数和值本身的偏移量。

要查找图像的大小,您需要分别扫描相关的IFD以获取值为256和257的标记。

这里有更详细的解释: http : //partners.adobe.com/public/developer/tiff/index.html#spec

我建议你看一个与tiff兼容的图像库,因为它很快就能读取一个TIFF文件变得非常复杂 – 它们有各种压缩格式等等,这使得它实现了很多工作。 TIFF的完整读者。

我用这段代码解决了问题:

 #include  #include "tiffio.h" #include  #include  int main(void) { DIR *dp; struct dirent *ep; uint32 w, h; float xdpi,ydpi; dp = opendir ("./"); char file_name[30]; char last[30]; if (dp != NULL) { while (ep = readdir (dp)) { if( ( strstr(ep->d_name, ".tif") != NULL ) || ( strstr(ep->d_name, ".TIF") != NULL ) ) { TIFF* tif = TIFFOpen(ep->d_name, "r"); TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xdpi); TIFFGetField(tif, TIFFTAG_YRESOLUTION, &ydpi); printf("%s --> %dx %d | %.f - %.f \n",ep->d_name, w, h, xdpi,ydpi); strncpy ( file_name, ep->d_name, ep->d_namlen-4 ); file_name[ep->d_namlen-4]='\0'; sprintf(last,"%s (%.fx %.f).tif", file_name, (float) ((w/xdpi)*2.54) , (float) ((h/ydpi)*2.54) ); printf(" |__ %s\n\n",last); TIFFClose(tif); rename(ep->d_name, last); } } (void) closedir (dp); } else perror ("Directory can not open!"); printf("Succesfully finished!"); getchar(); return 0; }