【问题标题】:C++ Read Information from Image [closed]C ++从图像中读取信息[关闭]
【发布时间】:2013-03-12 22:45:14
【问题描述】:

我必须从图像中读取一些信息。当我将 .tif 图像拖入 Visual C++ 2006 时,它显示如下: 我正在尝试读取时间图像右侧指定的最小值和最大值(以黄色突出显示)。我怎样才能做到这一点?从文件中读取时,我通常会这样做:

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

但是,当我对给定的图像尝试这种方法并在读入信息后立即尝试计算内容时,打印出来的只是:

contains = MM 
contains =
contains =

显然,它不起作用。它只读取一次信息,3次迭代后停止读取。

那么,我怎样才能从图像中获取最大值和最小值?

谢谢!

【问题讨论】:

  • 提示:不要将二进制文件作为文本文件打开。
  • 另外,图像的“最大值和最小值”是什么?
  • 您需要首先将图像转换为 .bmp 或其他反映单个像素值的格式。熟悉图像文件格式...并识别 TEXT 和 BINARY 文件之间的区别。
  • 可能(而且更便宜)打印输出并输入数字。

标签: c++ image binary


【解决方案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。请务必阅读名为二进制文件的部分。

【讨论】:

    【解决方案2】:

    尝试使用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 功能的完整参考。

    【讨论】:

    • 有人对您的问题投了反对票,但没有礼貌地发表评论。 tiff 文件通常是二进制文件,因此虽然您的 fscanf() 建议对于 text 文件是正确的,但它不适用于图像。我认为否决票是因为您错过了更大的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多