2009-08-28 11 views
0

私は何度もC言語のファイル操作を使ってtxtファイルを開いています。しかし、私はCファイルを使用して画像を開こうとすると、私はそれを行うことはできません。 私はバイナリモード( "rb")で画像ファイルを開くことによってこれを試みました。Cを使って画像を開く方法は?

これは

#include"file.h" 
#include"stdio.h" 
main() 
{ 
    FILE *fp;<br> 
    char ch;<br> 
    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

あなたがすることができますしてくださいあなたは「オープン」という意味を定義しますか?単にデータを読み込みたいのであれば、そのトリックを行うべきです。そうでなければ、どんなエラーが出ていますか?ピクセルデータを読み込みたい場合は、いくつかの仕様を読んだり、libjpeg、libpng、libなどを使う必要があります。 –

+0

'fgetc'の正しい使い方に関するドキュメントを読んでください。そのドキュメントは 'char'変数に結果を保存するのがなぜ正しいのかを説明しなければなりません。 –

答えて

2

他の人が触れたように、イメージはバイナリファイルなので、読み込んだ後にデータを "解釈"する方法を知っておく必要があります。幸いなことに、ほとんどのフォーマットでは、libpngやlibjpegのようなライブラリを見つけることができます。

1

は - BMPは、TIFFまたは全く...

あなただけの画像内のすべての単一のピクセルを取得し、それを保存することができとは全く異なっています。 setpixel()とgetpixel()を使用すると、ワールドビューのピクセルを保存してビューポートにマップすることができます。

2

Cでファイルを開くのは、通常は(offtopic:always about?:) fopen()

バイナリファイル形式(ほとんどのイメージファイル形式の場合など)について読んでいると仮定した場合、まずデータを正しく読み込むために何か勉強しなければなりません。あなたが読んでいるファイルタイプを教えてくれたら、もっと詳しい情報が得られます。

+0

Offtopic:移植性について気にしないなら、 'open(2)'を使うかもしれません。ほとんどの場合、しかし、常に。 –

+0

移植性について気にしない場合は、CreateFileも使用できます。私の推測では、多くのWin32プログラムが実際にそれを使用しているので、いつもそうはしません。 – Niki

0

私はこのことについてはあまりよく分かりませんが、ファイルポインタが先に進まないと感じています。インクリメンタルステートメントが必要です。毎回チェックするたびにwhile((ch = fgetc(fp))!=EOF) となります。また、最初のピクセルを印刷して繰り返します。

0

私は、ファイルを読み込み、バイナリ(ビット)方向でファイルを開き、バイト方向で読むことが問題だと思います。 はので、私はこの問題は、「fgetc関数」 であると考える代わりに「関数fread」

+0

ようこそStackOverflowへ!同様の回答は、すでに4年前にすでに与えられていました。追加するものがありますか? – Artemix

3

てみてくださいOpenCVのコミュニティには、画像の値にアクセスする、画像をロードするためにいくつかのルーチンを提供しています。実際、opencvチュートリアルのドキュメントのほとんどでは、多くの機能のCバージョンがあります。このリンクを参照することができますC_Api functions

ただし、opencvのCルーチンはC++/pythonルーチンに比べて少ないです。しかし、あなたが選択肢がなければ、彼らはいつも元気になる。

  1. 可能なルーチンの数が少ない(私はこの問題に直面している):

    また、インターネットコミュニティは、C(OpenCVのルーチン)目的での使用は二つの理由から時代遅れの方法はかなりあると考えています。

  2. Mat C++のオブジェクトとIplImage/cvMatのオブジェクトの間には互換性がありません。

    stdio.h, highgui.h, cv.hライブラリなどの後(ぼかし)いくつかのサンプルコード:

`int型のmain(int型のargcを、文字** 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; 

}`

関連する問題