2013-03-22 130 views
-1

我必须从图像中读取一些信息。当我拖动图像的.tif到Visual C++ 2006年,它显示了这样的: enter image description here 我想在最低和时间上的图像的右侧指定的最大值阅读(以黄色突出显示)。我怎样才能做到这一点?从文件中读取数据时,我通常会做这样的事情:C++从图像中读取信息

ifstream fileStream(file_name); 
string contents; 
while(fileStream >> contents) //do something 
fileStream.close(); 

然而,当我试图与给定图像这一做法,并作为信息被读入作为稍后再试couting的内容,全部是打印出来的是:

contains = MM 
contains = 
contains = 

显然,它不工作。它只读入一次信息,并在3次迭代后停止读取。

所以,我怎么能去获得从图像中最大值和最小值?

谢谢!

+8

提示:不要将二进制文件作为文本文件打开。 – deepmax 2013-03-22 22:59:16

+1

另外,图像的“最大值和最小值”是什么? – 2013-03-22 22:59:46

+0

您需要先将图像转换为.bmp或其他反映各像素值的其他格式。熟悉图像文件格式......并识别TEXT和BINARY文件之间的区别。 – Floris 2013-03-22 23:01:20

回答

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

+0

有人向你投了你的问题,但没有礼貌发表评论。 * tiff *文件通常是二进制文件,所以虽然你的'fscanf()'建议对*文本*文件是正确的,但它对于图像来说效果不好。我相信反对票是因为你错过了更大的问题。 – 2013-03-24 17:15:45

1

你的示例代码适用于读取文本文件,但你的TIFF文件(大部分)的二进制文件。所以你要做的第一件事就是以二进制方式打开该文件。

std::ifstream fileStream(file_name, std::ios::binary); 

<<-style提取器适用于格式化文本,但不适合二进制文件。

你需要知道的关于文件格式找出该文件中找到你后的值。我不知道关于TIFF的细节,所以你必须找到一个参考。它可能涉及在标题(例如fileStream.read(buffer, size))中读取,在标题中查找偏移量,移动到文件中的该位置(例如,filestream.seekg(offset, ios::beg)),然后解释该位置处的字节。

这里有一个decent tutorial on C++ file handling。请确保您阅读了称为二进制文件的部分。