用c++读取tiff图像

Reading a tiff image with c++

本文关键字:图像 tiff 读取 c++      更新时间:2023-10-16

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

4d  4d  00  2a  00  02  03  60

我得到的magino是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]='';

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

您正确读取了endianness标记,但没有对其采取操作。来自Adobe的"TIFF 6":

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

您需要两组例程从TIFF文件中读取短整数(以及读取较长的整数类型):一组读取Motorola("MM")大端数,另一组读取Intel("II")小端数。

实际上,您必须是一个小端系统,同时尝试以本机方式读取大端数。

正确阅读单词的代码可以像一样简单

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函数,该函数首先检查文件中存储的数据类型,然后调用正确的例程。