首页 文章

用c读取tiff图像

提问于
浏览
2

我正在尝试从tiff图像文件中获取信息 . Endian的输出是正确的,但其余的都是错误的 . tiff文件的前8个字节是:

4d  4d  00  2a  00  02  03  60

我得到的魔法是10752,其中2A00是HEX . 但我应该读第三个和字节,应该是002a . 需要帮助!

这是我的代码 .

#include <iostream>
#include <fstream>


using namespace std;

int main()
{
    char buffer[3];

    short magicno;
    int ifdaddress;
    short ifdcount;


    ifstream imfile;
    imfile.open("pooh.tif",ios::binary);

    imfile.seekg(0,ios::beg);

    imfile.read(buffer,2);
    imfile.read((char*)&magicno, 2);
    imfile.read((char*)&ifdaddress, 4);

    imfile.seekg(ifdaddress, ios::beg);
    imfile.read((char*)&ifdcount, 2);

    imfile.close();

    buffer[2]='\0';


    cout<<"Endian: "<<buffer<<endl;
    cout<<"Magic: "<<magicno<<endl;
    cout<<"IFD Address: "<<ifdaddress<<endl;
    cout<<"IFD CountL "<<ifdcount<<endl;

    return 0;

}

我的输出是:

Endian: MM
Magic: 10752
IFD Address: 1610809856
IFD CountL 0

1 回答

  • 1

    您正确读取了字节顺序标记,但您没有对其进行操作 . 来自Adobe的"TIFF 6":

    字节0-1:文件中使用的字节顺序 . 合法值为:“II”(4949.H)“MM”(4D4D.H)在“II”格式中,对于16位和32位,字节顺序始终从最低有效字节到最高有效字节位整数 . 这称为little-endian字节顺序 . 在“MM”格式中,对于16位和32位整数,字节顺序始终从最高有效到最低有效 . 这称为big-endian字节顺序 . (https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf)

    您需要两组例程来读取TIFF文件中的短整数(以及读取更长的整数类型):一个读取Motorola(“MM”)大端数字,一个读取Intel(“II”)小endians .

    事实上,你必须是一个小端系统,同时还要原生地阅读大端数字 .

    正确读取单词的代码可以很简单

    unsigned char d1,d2;
    imfile.read (&d1,1);
    imfile.read (&d2,1);
    if (magicno == 0x4949)
       word = d1 + (d2<<8);
    else
       word = (d1<<8)+d2;
    

    未经测试,但一般的想法应该是明确的 . 最好使它成为一个函数,因为您需要为“LONG”数据类型设置类似的设置,而“RATIONAL”数据类型又需要这种设置 .

    最终,对于TIFF文件,您可能需要一个通用的 read_data 函数,该函数首先检查文件中存储的数据类型,然后调用正确的例程 .

相关问题