如何使用C语言打开图像?

4

我经常使用C语言的文件处理工具打开.txt文件。但是当我尝试使用与文本文件相同的过程打开图像文件时,我就无法做到这一点。

我甚至尝试以二进制模式"rb"打开图像文件。

这是我正在使用的代码:

#include "file.h"
#include "stdio.h"

main()
{
    FILE *fp;
    char ch;
    fp = fopen("D:\\setups\\tcc\\Bluehills.bmp", "rb+");

    if(fp == NULL)
    {
        printf("Error in opening the image");
        fclose(fp);
        exit(0);
    }

    printf("Successfully opened the image file");

    while((ch = fgetc(fp)) != EOF)
    {
        printf("%c", ch);
    }

    printf("\nWriting to o/p completed");
}

我需要修改什么才能得到原样的图像?由于我将图像输出到DOS窗口,因此至少需要出现一个单色像素图像。

4
请问您所说的“open”是什么意思?如果您只是想读取数据,那应该就可以了。如果不行,您遇到了什么错误呢?如果您想要读取像素数据,您可能需要阅读一些规格说明,或者使用libjpeg、libpng、lib...等库。 - Matthew Scharley
请阅读有关正确使用 fgetc 的一些文档。该文档应该解释为什么将结果保存在 char 变量中永远不正确。 - Roland Illig
6个回答

5
Opencv社区提供了一些用于加载图像、访问图像值的例程。事实上,在大多数Opencv教程文档中,我们会找到许多函数的C版本。您可以查看此链接:C_Api functions
然而,有一个免责声明:与C++/python例程相比,Opencv的C例程较少。但如果没有选择,它们总是备用选择。
此外,互联网社区认为使用C(Opencv例程)目的是一种过时的方法,原因如下:
  1. 可用的例程数量很少(我曾经遇到过这个问题)。
  2. C++的Mat对象与C的IplImage / cvMat对象之间没有兼容性。
  3. 包括库后的一些示例代码(模糊):

int main( int argc, char** argv ) {
 
    IplImage* img = 0;
    IplImage* out = 0;

    if( argc < 2 ) {
        printf( "Usage: Accepts one image as argument\n" );
        exit( EXIT_SUCCESS );
    }

    img = cvLoadImage( argv[1] );

    if( !img ) {
        printf( "Error loading image file %s\n", argv[1]);
        exit( EXIT_SUCCESS );
    }

    out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );


    cvSmooth( img, out, CV_GAUSSIAN, 3, 3 );

    cvReleaseImage( &img );
    cvReleaseImage( &out );
    cvDestroyWindow( "Example1" );
    cvDestroyWindow( "Output" );
    return EXIT_SUCCESS;
}

3

正如其他人所提到的,由于图像是二进制文件,因此在读取它们后必须知道如何“解释”其中的数据。幸运的是,对于大多数格式,您可以找到为您执行此操作的库,例如libpng或libjpeg。


2

C中打开文件通常(离题:总是? :))使用fopen()

现在,当涉及到读取并且假设您正在讨论二进制文件格式(例如大多数图像文件格式的情况),那么您需要先进行一些研究以正确读取数据。如果您告诉我们您要读取的文件类型,可能会获得更详细的信息。


离题:如果你不在乎可移植性,你可以使用 open(2),所以并不总是这样。虽然几乎总是这样。 - Chris Lutz
如果你不关心可移植性,你也可以使用CreateFile。我猜许多Win32程序实际上都在使用它,所以并不总是这样。 - Niki

1

这取决于文件扩展名 - BMP 格式与 TIFF 或其他格式完全不同...

您可以获取图像中的每个像素并存储它。使用 setpixel() 和 getpixel() 函数,您可以从世界坐标系中存储像素,并将其映射到视口坐标系中...


0

我不是很确定这个问题,但我感觉你的文件指针没有向前移动。你需要一个增量语句。每次检查 while((ch = fgetc(fp))!=EOF) 时,它都会返回 true。它还会进入并重复打印第一个像素!


0
我认为问题出在读取文件上,因为您以二进制(位)方向打开文件并以字节方向进行读取。 所以我认为问题出在"fgetc"上, 建议改用"fread"。

欢迎来到StackOverflow!类似的答案已经在将近4年前给出了。您有什么更多的补充吗? - Artemix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接