用c++读取tiff图像
Reading a tiff image with c++
我正试图从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
函数,该函数首先检查文件中存储的数据类型,然后调用正确的例程。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在 OpenCV c++ 中压缩 TIFF 格式的图像?
- 是否可以通过每次在内存中仅保存一个平铺来处理完整的平铺 tiff 图像?
- 将 16 位单通道图像写入 Tiff
- 用c++读取tiff图像
- 带有GUI的C++程序,可使用远程放置的相机进行拍摄并读取未压缩的TIFF图像
- 将 tiff 图像转换为字符串,以作为二进制应用程序/八位字节流 (C++) 发布
- c++ 32位tiff图像保存和加载
- 我如何将TIFF图像数据传递给JUCE(不支持TIFF)
- 用于将JPEG图像转换为TIFF格式的C, c++或Objective-C代码
- 处理大型TIFF图像C++/Magick/libtiff
- 访问TIFF图像
- 读取tiff图像tesseract和leptonica
- 在内存中计算TIFF图像大小[C/ c++]