• ベストアンサー

ファイルの中の画像読み込み

VC++でOpenCVを使いながらプログラムを組んでいます。 大量の画像に自分の作ったプログラムの処理をかけようと思っています。 そこで、ファイルの中にある、名前に共通性のない画像に対して処理をかけたいのですが、 その画像読み込み方法がわかりません。 このような場合はすべて名前を手で変更なりするしかないのでしょうか。 どこかのHPには載っているのかもしれませんが、 相応しいワードが見つからず自分の手では見つけられませんでした。 できればHPかプログラムの書き方、検索ワードでもいいので教えていただきたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • unacyo
  • ベストアンサー率51% (35/68)
回答No.2

1ファイル複数ならば、各画像ファイルには必ずヘッダが付きますので、それを検索するしかありません。 ただし、このヘッダは画像ファイル毎に違います。 BMPならば頭2バイトが'BM'で始まりますし、JPEGならばJPEG(かJFIF?)で始まる、みたいになります。 これらを見つけたら各画像のヘッダサイズ分読み込んでみて、合っていればそこからヘッダに書かれているサイズ分のデータを画像データとして読み込めば良いかと。 ただし、PNGはこの様にいかず、出だしが数値からはじまりますので、気を付けてください。

mitti0157
質問者

お礼

お返事遅くなって申し訳ありません。 たびたびありがとうございます。 参考にさせていただきます。 BMPでやろうと思っているので、ヘッダサイズを使ってやってみようと思います! ありがとうございました。

その他の回答 (1)

  • unacyo
  • ベストアンサー率51% (35/68)
回答No.1

大量の画像が1ファイル1画像なのか、1ファイル複数画像×複数ファイルなのか判りませんが、 おそらく、ファイルの取得方法が判らないのではないか、と推測して回答します。 (ファイル名がわかれば、ロードして画像を加工するのはできるんですよね?) 画像のあるフォルダ内をFindFirstFile()とFindNextFile()でファイル名を取得してファイル一覧を作れば、 手でファイル名を直す必要はありません。 もしくは、system("dir /b (画像フォルダのパス) > .\\tempfile.txt")を呼び出しせば、tempfile.txtに 1行1ファイル名を格納するテキストファイルが作れますから、1行ずつ読み込んでファイル名を取得 する手もあります。 フォルダの中に複数のフォルダがあってファイルのある階層の深さに一貫性がないなら、 FindFirstFile(),FindNextFile()でフォルダ名も取れますから、それをリストに記憶しておいて、 ファイル名列挙が終了したら、次はその記憶したフォルダ名で新しく検索を開始すれば、 フォルダ階層にも対応できるはずです。 手抜きの方法としては、上のsystem()呼び出しのdirのオプションに/sを追加して、/s /bとすれば、 フォルダ名のついた複数階層のファイル名も取得できます。(たぶんこれが手っ取り早い) コマンドプロンプトを開いて、dir /s /b (画像TOPフォルダパス名) とでもすれば、取得できるファイル名がわかると 思います。

mitti0157
質問者

お礼

早くに返答ありがとうございます。 1ファイル複数画像でした。 書き方が悪かったみたいで、申し訳ありません。 とても勉強になります。 参考にさせていただきます。 本当にありがとうございました。

関連するQ&A