- ベストアンサー
C言語で画像処理
C言語で画像処理をしたいのですが、元となる画像の形式は何がよいのでしょうか?BMP,GIF,JPEG,PNG,などいろいろな形式がありますよね。一般的には画像処理プログラミングをするときに、どの形式の画像を用いるのでしょうか? また、その画像の読み込み方がわかりません。C言語は入門書を一通りやってみた程度で、画像処理のプログラミングの仕方がわかりません。 初心者なものでよろしくお願いします。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
画像処理と言っても様々な種類があります。 動画、静止画。 静止画の中でもベクトル画像かラスタ画像かで扱いは違います。 比較的取り扱いの容易なラスタ画像であっても2値画像(白黒)、グレースケース画像、インデックス画像、ハイカラー/フルカラー画像では違いがあります。 さらに、フルカラーラスタ画像にはインターリーブ形式とプレーンマップ形式があります。 そして、その上RGB、CMY,CMYKなどの色表現形式の違い。 最後に画像データを納めるファイルフォーマットの違いがあり、ファイルフォーマットごとに付加機能(透過、プログレッシブ、圧縮など)があります。 処理内容によって向いている画像形式と向いていない画像形式があります。 たとえば「RGB各要素ごとに近傍画素の平均を取る」という処理はプレーンマップ形式よりインターリーブ形式の方が扱いやすい。 専門学校で画像処理プログラミングを教えていたときには「Adobe Photoshop Plug-in」を題材にしていました。 理由は ・ファイルフォーマット、ファイルが持つ機能を気にしなくて良い フィルタプラグインの処理対象は「ウィンドウに表示された画像の選択部分」なので、ファイルやデバイスなどの「画像処理の本質でない部分」を無視できます。 ・処理対象とする画像を細かく指定することが出来る 「RGB24bit画像しか相手にしない!」とか「フルカラー画像なら全部サポート」などと言った指定が可能で、対応していない画像についてはPhotoshopがフィルタメニュー上で「対象外」であることを示してくれます。 ・ユーザインタフェースはPhotoshopが代行してくれる 画像全体を対象にする処理ばかりではありません。 処理対象範囲の指定など、「画像処理の本質」でない部分をPhotoshopに任せることが出来ます。 Photoshopは適切なマスク処理を接してくれるので、プラグインは細かいことを気にしないで処理に専念できます。 自分でマスク処理をしたいときは、「勝手にマスク処理をするな!」と要求することも出来ます。 ・インターリーブ形式、プレーンマップ形式を指定することが出来る 処理アルゴリズム的に「画像データはインターリーブ形式が都合がいい」とか「どうしてもプレーンマップ形式じゃないとダメ」と言う場合、Photoshopに欲しい画像の形式を要求しておくと、要求された形式に変換してくれます。 つまり「余計なことはいっさい考えなくていい」というすばらしい環境です。 Photoshopを持っていなくても、Photoshop Plug-in Interface互換のPlug-inインターフェースを持つ画像処理アプリケーション(Paint Shop Proなど)でもPhotoshop Plug-inは使うことが出来ます。 Photoshop SDK(プラグインを作るための解説、ライブラリ、サンプル集)はPhotosop6.5対応までの物なら無償でAdobeのWebサイトから入手できます(解説は全て英語)。 Photoshop7対応の日本語版Photoshop SDKは有償(めっちゃ高い!)です。 chaborinさんは興味のある分野に関して深く探求される方だと感じましたので、わざと専門用語だらけにしました。 画像処理技術者としてはこの程度の知識は必須なので頑張って調べてください。 最後にどうしてもファイルから処理したい場合について… BMP形式はWindowsのDIBを理解していないとキツイです。 画像が上下逆さまに入ってたたり、色表現範囲に不条理な制限があったり。 Win32APIの勉強としてならBMPでもいいと思いますが、私ならTIFFを対象にします。 データ並び、圧縮方法、画像フォーマット(インターリーブ、プレーンマップ)、色表現形式(RGB,CMYなど)などの要素の勉強には各要素ごとにTAGが用意されているTIFFが最適です。 次の候補はPNGかな。 Win32APIを学ぶのではなく、画像処置を学ぶのならTIFFかPNGが最適でしょう。 JPEGもライセンス問題があるので、今から勉強するならGIF(ライセンス期限が迫っている)の方がいいと思います。
その他の回答 (9)
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
こんにちは。 ファイルの読み込みはSusieプラグインを利用すると簡単で、多種多様なファイルが読み込めます。 http://www.digitalpad.co.jp/~takechin/ http://www2f.biglobe.ne.jp/~kana/develop.html
- furyfox
- ベストアンサー率56% (58/103)
>BMPは少々難しいと聞いています。 >JPEGが身近に知っているので、JPEGでやっていきたいです。 補足ですが、 JPEGの方が格段に難しいかと思います。 簡単に読み込めるのは他人が作ったライブラリーを 使用するからです。 それにVC++6.0で直接jpegデータを書き込むライブラリー やクラスは標準では無かったと思います。 JPEGについてのサイトも紹介しておきます。 http://plaza27.mbn.or.jp/~inetwada/jpeg1.htm http://hp.vector.co.jp/authors/VA021872/proctalk/talk9.htm http://www.kamakuranet.ne.jp/~smo/proctalk/proctalk.htm
- furyfox
- ベストアンサー率56% (58/103)
>BMPを読み込むにはどのようにしたらよいのでしょうか? 普通にバイナリで読み込むだけです。 fopenとかfstreamで。 「BMP ヘッダ」で検索すれば 関連サイトはいっぱい出てきます。
Windows 上でのプログラミングでしたら、BMPを理解してしまうと応用が利きますので、私もそれをお勧めします。 ファイル構造は、基本的には BITMAPFILEHEADER + BITMAPINFO + ビットデータ になっているので、それぞれの構造体について検索エンジンなども併用して理解を深めていけば、読み込みと書き込みは、それほど難しくないと思います。 (無圧縮のとき以外は簡単ではないですが・・・) どんな画像フォーマットを使用するにしても、画像処理そのものはメモリ中で無圧縮のデータを扱うことになるでしょうから、画像処理がメインであれば、画像フォーマットは無圧縮の簡単なものでいいと思います。 JPEGなどは、画像を圧縮する為のものであって、WEBで配信するなどの目的には適していますが、入力も出力もロスありのJPEGにしてしまうと画質が下がってしまい、画像処理の結果を目で見て正しく判断できなくなります。
- furyfox
- ベストアンサー率56% (58/103)
どういう画像処理を行いたいのかにも依りますが 一番扱いやすいのは 身圧縮で単純なBMPデータです。 BMPデータはヘッダに 画像の高さや幅、色数などの情報が書かれており その後にそれに沿ったバイナリデータが続いている 単純なものです。 BMP形式で処理し 保存時にJPG等に変換するとかでどうですか?
補足
ありがとうございます。 BMPですかぁ。 BMPを読み込むにはどのようにしたらよいのでしょうか? 何か参考になる本やサイト、ありましたらお願いします。
- zuntac
- ベストアンサー率36% (45/124)
#3:zuntacです。参考資料にあげた本はJPEGエンコーダ、デコーダを実際のCのソースコード付きで解説しています。これは実際に動くプログラムなので、実例としては最適かと思います。まずは、このプログラムの中身を充分に理解することで広範囲に画像処理に必要な知識が身に付くと思います。ここで得られた知識を元にして、ほかのPNGやGIFなどについてもさらに情報を集めて勉強するのが得策でしょう。例えば、このエンコーダ、デコーダの拡張機能としてPNGやGIFを扱う機能を実装してみるなどして応用範囲を広げるなどしてみてください。Good luck!
お礼
またまたありがとうございます。 1つの形式が扱えれば他の形式も理解しやすくなりますでしょうか??? まずはJPEGやってみますね。
- toysmith
- ベストアンサー率37% (570/1525)
ごめんなさい! 今調べたら、Adobe.comからPhotoshop6.5SDKのダウンロードサイトが無くなってます。 どうやらAdobe Solutuin Network会員(会費有料)しか使えないみたいです。 昔はAdobe Photoshopに付属していたんですが、Photoshop7.0からは付属もなくなってます。 基本的にプラグインの概念は同じなので、他の画像処理ソフトのプラグインで画像処理を学ぶことは可能です。 Windows向け画像処理アプリケーションのプラグインSDKはほとんどの場合、Visual C++6.0対応です。 たまに、バージョンの古いVC++を要求してくる物がありますが、Visual C++は旧バージョンのプロジェクトを変換して新バージョンに対応させる機能を持っているので大丈夫です。
お礼
またまたありがとうございます。 プラグインSDK.....。 またわからない言葉が出てきましたねぇ。 しらべます。 プラグインというのはどのような位置にいるものなのかがよくわかってないんですよね。
- zuntac
- ベストアンサー率36% (45/124)
画像処理についての基本的な勉強をかなりする必要があります。C言語を一通りやってみただけでは、大きな処理を行うプログラムを書く、つまり機能別にいくつかのファイルでモジュールを構成するというような手法が身に付いていないと思います。画像ファイルの入出力、画像の処理の理論、記述テクニックなどの修得も必要です。参考URLにあげた本はこれらの技術の勉強に最適です。ここではJPEGファイルの入出力、JPEGによる圧縮、解凍に必要なテクニックが全てCのソースコード付きで解説されてます。初めてだとチトつらいかもしれませんが、これがものにできればかなりの技術が身に付きます。頑張ってください。
お礼
本の紹介ありがとうございます。 ファイル形式についてはJPEGが扱えるようになれば、ほかのPNGやGIFなども扱えるようになるのでしょうか? とりあえずは「画像ファイルの入出力」をできるようにしたいので、紹介してくださった本を探してみようと思います。
- ginyou
- ベストアンサー率32% (138/431)
基本はBMPですね あとGIFは著作権の問題がありますので、やめといたほうがいいでしょうね 後はJPEGがいっぱんてきでしょうね。
お礼
基本はBMPなのですか? BMPは少々難しいと聞いています。 JPEGが身近に知っているので、JPEGでやっていきたいです。
お礼
詳しい説明ありがとうございます。 知らない用語がいくつも出てきて、勉強不足を痛感しました。 >最後にどうしてもファイルから処理したい場合について… といわれて戸惑ったのですが、私は画像処理といえばファイルから処理する(Cの中に画像ファイルを読み込んで、いろいろな処理を施す。でいいんですよね?)ものが一般的だと思ってました。 Photoshop Plug-inというものがまだわかってませんが、これを使うと便利だということはわかりました。 これはCにも取り入れることができるのでしょうか?(VC++6.0を使ってます。) いろいろ調べてみようと思います。