我必须从图像中读取一些信息。当我将.tif图像拖到Visual C ++ 2006中时,它会显示如下: 我试图读取时间图像右侧指定的最小值和最大值(以黄色突出显示)。我怎样才能做到这一点?从文件中读取时,我通常会这样做:
ifstream fileStream(file_name);
string contents;
while(fileStream >> contents) //do something
fileStream.close();
然而,当我尝试使用给定图像的这种方法并在读入信息时尝试引用内容时,所有打印出的内容都是:
contains = MM
contains =
contains =
显然,它不起作用。它只读取一次信息,并在3次迭代后停止读取。
那么,我怎样才能从图像中获取最大值和最小值?
谢谢!
答案 0 :(得分:1)
您的示例代码适用于读取文本文件,但您的TIFF文件(大部分)是二进制文件。所以你要做的第一件事就是以二进制模式打开文件。
std::ifstream fileStream(file_name, std::ios::binary);
<<
样式的提取器适用于格式化文本,但不适合二进制文件。
您需要了解文件格式,以确定文件中的哪个位置可以找到您所追求的值。我不知道TIFF的细节,所以你必须找到一个参考。它可能涉及读取标题(例如,fileStream.read(buffer, size)
),在标题中查找偏移量,移动到文件中的该位置(例如,filestream.seekg(offset, ios::beg)
),然后解释其中的字节位置。
这是一个decent tutorial on C++ file handling。请务必阅读名为二进制文件的部分。
答案 1 :(得分:0)
尝试使用fscanf()
。
#include <cstdio>
FILE * file = fopen("filename.tiff","r");
char c;
fscanf(file,"%c",&c);
这将从文件中读取单个字节。通过以这种方式反复调用fscanf()
,您可以读取文件,在min的情况下查找字节'm','i'和'n'。找到后,您可以使用
int num;
fscanf(file,"%d",&num);
读取下一次出现的文本号码(用ASCII或其他编码写的数值,而不是二进制。
关于fscanf can be found here的功能的完整参考。