如何用C打开图像?

时间:2009-08-28 08:37:25

标签: c

我使用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窗口时,必须至少出现单色像素图像。

6 个答案:

答案 0 :(得分:4)

Opencv社区提供了一些例程来加载图像,访问图像的值。实际上,在大多数opencv教程文档中,我们都会找到许多函数的C版本。您可以查看此链接C_Api functions

但是,有一个免责声明:与C ++ / python例程相比,opencv的C例程更少。但如果你别无选择,他们总会在那里徘徊。

此外,互联网社区认为使用C(Opencv例程)目的是一种过时的方法,原因有两个:

  1. 可用的例程数量很少(我遇到过这个问题)。
  2. C ++的Mat个对象与C的IplImage/cvMat个对象之间没有兼容性。

    包含stdio.h, highgui.h, cv.h库后的一些示例代码(模糊):

  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;
    

    }`

答案 1 :(得分:2)

在C中打开文件通常是(offtopic:总是如何?:)使用 fopen()完成。

现在,当涉及到阅读并假设您正在谈论二进制文件格式(例如大多数图像文件格式的情况)时,您必须先进行一些研究才能正确读取数据。如果您告诉我们您正在尝试阅读哪种文件类型,或许您将获得更详细的信息。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

这实际上取决于扩展 - BMP与TIFF完全不同,或者无论如何......

您可以获取图像中的每个像素并存储它。使用setpixel()和getpixel(),您可以存储来自worldview的像素,并将它们dmap到视口...

答案 4 :(得分:0)

答案 5 :(得分:0)

我认为问题在于读取文件,bcoz u r以二进制(位)方向打开文件并以字节方向读取。 所以我认为问题在于“fgetc” 而是尝试“fread”