2

如何在 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

我不太了解c,
尝试过这样的事情:

#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 文件做什么?

4

3 回答 3

1

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

要查找图像的大小,您需要扫描相关的 IFD 以查找分别具有值 256 和 257 的标签。

此处对此进行了更详细的解释: http ://partners.adobe.com/public/developer/tiff/index.html#spec

我建议您查看与 tiff 兼容的图像库,因为读取 TIFF 文件很快就会变得非常复杂 - 它们具有各种压缩格式等,这使得实现一个相当多的工作TIFF 的完整阅读器。

于 2013-06-07T09:14:15.243 回答
1

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

#include <stdio.h>
#include "tiffio.h"
#include <string.h>
#include <dirent.h>     
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 --> %d x %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 (%.f x %.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;
}
于 2013-06-11T08:30:52.150 回答
0

您将“标签 ID”(256 和 257)误解为索引,这是行不通的。

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

请注意,TIFF 没有包含所有信息的“标题”,您需要在文件中查找您想要的内容。

于 2013-06-07T09:11:24.953 回答