Как открыть изображение с помощью C? - PullRequest
1 голос
/ 28 августа 2009

Я много раз открывал файл .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 ]

4 голосов
/ 20 февраля 2018

Сообщество Opencv предлагает несколько процедур для загрузки изображения, доступа к значениям изображения. Фактически, в большинстве учебников по opencv мы найдем C-версию для многих функций. Вы можете посмотреть эту ссылку C_Api functions .

Однако, есть один отказ от ответственности: подпрограммы C opencv меньше по сравнению с подпрограммами C ++ / python. Но если у вас нет выбора, они всегда готовы вернуться.

Более того, интернет-сообщество считает, что использование целей C (подпрограммы Opencv) является устаревшим методом по двум причинам:

  1. Доступных подпрограмм немного (я сталкивался с этой проблемой).
  2. Нет совместимости между Mat объектами C ++ и IplImage/cvMat объектами C.

    Пример кода (размытие) после включения stdio.h, highgui.h, cv.h библиотек:

`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;

} `

2 голосов
/ 28 августа 2009

Как уже упоминали другие, поскольку изображения представляют собой двоичные файлы, вы должны знать, как «интерпретировать» данные в них после их чтения. К счастью, для большинства форматов вы можете найти библиотеки, которые делают это для вас, например libpng или libjpeg.

2 голосов
/ 28 августа 2009

Открытие файлов в C обычно (оффтоп: как насчет всегда? :) выполняется с помощью fopen () .

Теперь, когда речь заходит о чтении и в предположении, что вы говорите о двоичных форматах файлов (например, в случае большинства форматов файлов изображений), вам сначала нужно провести некоторое изучение, чтобы правильно прочитать данные. Если вы сообщите нам, какой тип файла вы пытаетесь прочитать, возможно, вы получите более подробную информацию.

1 голос
/ 28 августа 2009

Это действительно зависит от расширения - BMP полностью отличается от TIFF или чего-то еще ...

Вы можете просто получить каждый пиксель на изображении и сохранить его. С помощью setpixel () и getpixel () вы можете сохранять пиксели из мировоззрения и отображать их в окне просмотра ...

0 голосов
/ 23 июля 2013

Я думаю, что проблема в чтении файла, потому что он открывает файл в двоичной (битовой) ориентации и читает в байтовой ориентации. так что я думаю, что проблема с "Fgetc" вместо этого попробуйте с "Fread"

0 голосов
/ 26 июля 2010

Я не очень уверен в этом, но я чувствую, что указатель вашего файла не движется вперед Вам нужно дополнительное заявление. Каждый раз, когда он проверяет while((ch = fgetc(fp))!=EOF) это выходит правда. Это также идет внутрь, чтобы распечатать первый пиксель и повторяется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...