gpt4 book ai didi

c++ - 使用 C++ 读取 tiff 图像

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:34 24 4
gpt4 key购买 nike

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

4d  4d  00  2a  00  02  03  60

我得到的 magicno 是 10752,也就是 2A00 是十六进制。但我应该读取第三个字节,它应该是 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

最佳答案

您正确阅读了字节顺序标记,但您没有采取操作。来自 Adob​​e 的“TIFF 6”:

Bytes 0-1:
The byte order used within the file. Legal values are:
“II” (4949.H)
“MM” (4D4D.H)
In the “II” format, byte order is always from the least significant byte to the most significant byte, for both 16-bit and 32-bit integers. This is called little-endian byte order. In the “MM” format, byte order is always from most significant to least significant, for both 16-bit and 32-bit integers. This is called big-endian byte order.
(https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf)

您需要两组例程来从 TIFF 文件中读取短整数(以及读取较长的整数类型):一组读取摩托罗拉(“MM”)大端数字,一组读取英特尔(“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 函数,该函数首先检查文件中存储的数据类型,然后调用正确的例程。

关于c++ - 使用 C++ 读取 tiff 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29882783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com