dポイントプレゼントキャンペーン実施中!

BMP画像を開いてデーターの総量でショートカットを起動するというのを書いてみたんですが・・・fopenすらできなかったという悲惨な事態に・・・。
本当はBMPでRGBの量によって判別するつもりだったんですけど、どうもBMPの構造や、開いた後の変数への入れ方等が出来なくて苦戦してます。
BMPの構造等読んでも正直開くことも出来ないぐらい自分レベル低いですがソースを書いてみました。
一応二つ・・・どっちも動かなかったんですけど、イメージはこんな感じです。
fopenで開いた後はforとかで配列に入れるだとか、fopenなら開いてるファイルのバイトがわかるやら色々サイトを見てきたんですが理解できなかったです。
structとか苦手なので半分くらいしか本当は解ってないのでですが・・・。

出来ればfopenのやり方を教えていただければあとは比較する文ぐらいなら自分で考えられそうなんですが(~~<~~とか)
ヒントを教えてください。(ヒント言われても自分理解できるのかな・・・)


#include <stdio.h>


#include<string.h>
#include<stdlib.h>


int main()
{
typedef struct tagBITMAPFILEHEADER {
unsigned short bfType;
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
} BITMAPFILEHEADER;

FILE *fpr;
long bitsize,hutatume;

fpr=fopen("テスト.bmp","r");
bitsize=0;
fscanf(fpr,"%ld","bfSize",&bitsize);
if(bitsize>0){
printf("一応ちゃんと読みこめている");
}
return 0;
}



#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
int main(void)
{
FILE *fp;
char *fname = "test.bmp";
long size;
int A=1000;

fp = fopen( fname, "rb" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}

fseek( fp, 0, SEEK_END );
size = ftell( fp );
if(size>A){
ShellExecute(NULL, _T("open"), _T("http://www.yahoo.co.jp"), NULL, _T(""), SW_SHOW);
}
fclose( fp );
return 0;
}

A 回答 (4件)

まずは、基礎を勉強してから。



「どっちも動かなかったんですけど」とありますが、具体的に、どんな動作をしたのですか?エラーになったのなら、どんなエラーメッセージが出ているのですか?
プログラムを修正するときは、どこが原因でどう「動かない」かを確認することが大事です。


2つ目のプログラムは、ファイル指定さえ間違えなければ、問題無く動作するはずです。
一般の範囲では、致命的な間違いはありません。
(intの最大値を越えると問題ですが、そんなBMPはまずありません)

絶対パスを書くときは、\の扱いに注意しましょう。


1つめのプログラムは、見ただけでわかるの問題点があります。

・失敗しているのは、fopenなのか、それ以外なのか?それを調べましょう。
fopenは失敗の多い関数です。成功したかどうかを確認するのが普通です。
1例として、fopenのあとに次のコードを入れるなどします。これは、エラーメッセージを出力して終了します。

if( fpr == NULL ) {
perror(NULL);
return 1;
}

/* 2つ目のプログラムには同様の処理が入っているんですが。 */
perrorについては、マニュアルを。
http://msdn.microsoft.com/ja-jp/library/9t0e6085 …

既に指摘があるように、ファイルがカレントディレクトリにあるか?ファイル名が間違っていないか等を確認してください。

・fopenのモードに注意しましょう。
Windowsの場合、バイナリモードとテキストモードで動作に違いがあります。
BMPのようなバイナリファイルを読むときに、テキストモードを使うと正常に読み込むことができません。

・fscanfはテキストファイルから読み込んだ文字列を、書式に従って変換して変数などに取り込むものです。
バイナリファイルであるBMPから、%ldで「数字の並んだ文字列」を読み込むなど、まずありえません。
また、
fscanf(fpr,"%ld","bfSize",&bitsize);
の場合、 %ldに対応しているのは、第3引数である"bfSize"です。
このように記述された文字列リテラル(文字列の定数)は、const char *型のポインタとして処理されます。
仮に、%ldで数値が読み込めたとしても、その読み込み先は、"bfSize"の文字列が格納されているメモリ空間であり、変数bufsizeではありません。
おそらく、保護されている領域への書き込みになり、エラーで止まるでしょう。
    • good
    • 0

「わからない」ばかりで、とてもプログラミングができるレベルには見えないのですが……。


あなたの場合、基礎が全く出来ていませんので、まずはプログラミングの入門からやり直すべきです。
    • good
    • 0

>出来ればfopenのやり方を教えていただければあとは比較する文ぐらいなら自分で考えられそうなんですが(~~<~~とか)


>ヒントを教えてください。(ヒント言われても自分理解できるのかな・・・)

なら、とりあえず確認すべき点として1つ。

>fpr=fopen("テスト.bmp","r");

>char *fname = "test.bmp";
>fp = fopen( fname, "rb" );

相対パス指定のようなので「カレントディレクトリにそのファイルが存在」しますか?
# 絶対パスではないですから相対パス…ですわな。
    • good
    • 0

以前使ったソースを わざと切り貼りしたサンプル



エラー処理は削ってますし切り貼りなのでそのままではエラーになるかもしれませんが
必要な基本的情報は網羅してるはずです

資料読んで理解できない人がここで回答して理解できるのかという根本疑問があるので
あとは自分で調べてください

BITMAPFILEHEADER bmpfh;
CFile file;

LPBITMAPINFO lpbmi; // BITMAPINFO 構造体 へのポインタ

int nHeaderSize;

// BMPヘッダサイズ
nHeaderSize = sizeof(BITMAPFILEHEADER);

// ファイルを開く
file.Open("ファイル名", CFile::modeRead | CFile::typeBinary | File::shareDenyNone)

//BMPファイル(ヘッダ)情報を読む
file.Read((void *) &bmpfh, nHeaderSize)

// データ読み込みのために、グローバルメモリを割り当てる
BYTE *m_pDIB
m_pDIB = (BYTE *) new char[file.GetLength() - nHeaderSize];

// バッファに画像情報+色データを読み込む
file.ReadHuge(m_pDIB, file.GetLength() - nHeaderSize);

file.Close();

lpbmi = (LPBITMAPINFO)m_pDIB;

//画像情報へのアクセス例
lpbmi->bmiHeader.biWidth  //画像 横サイズ
lpbmi->bmiHeader.biHeight; //画像 縦サイズ

//メモリ開放
delete m_pDIB

この回答への補足

ふむふむ・・・何となく理解できて来ました。
この処理に必要なヘッダーはやっぱりbmp.hでしょうか?

補足日時:2013/06/06 20:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!