• ベストアンサー

C言語で画像処理

C言語で画像処理をしたいのですが、元となる画像の形式は何がよいのでしょうか?BMP,GIF,JPEG,PNG,などいろいろな形式がありますよね。一般的には画像処理プログラミングをするときに、どの形式の画像を用いるのでしょうか? また、その画像の読み込み方がわかりません。C言語は入門書を一通りやってみた程度で、画像処理のプログラミングの仕方がわかりません。 初心者なものでよろしくお願いします。

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

画像処理と言っても様々な種類があります。 動画、静止画。 静止画の中でもベクトル画像かラスタ画像かで扱いは違います。 比較的取り扱いの容易なラスタ画像であっても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(ライセンス期限が迫っている)の方がいいと思います。

chaborin
質問者

お礼

詳しい説明ありがとうございます。 知らない用語がいくつも出てきて、勉強不足を痛感しました。 >最後にどうしてもファイルから処理したい場合について… といわれて戸惑ったのですが、私は画像処理といえばファイルから処理する(Cの中に画像ファイルを読み込んで、いろいろな処理を施す。でいいんですよね?)ものが一般的だと思ってました。 Photoshop Plug-inというものがまだわかってませんが、これを使うと便利だということはわかりました。 これはCにも取り入れることができるのでしょうか?(VC++6.0を使ってます。) いろいろ調べてみようと思います。

その他の回答 (9)

回答No.10

こんにちは。  ファイルの読み込みはSusieプラグインを利用すると簡単で、多種多様なファイルが読み込めます。 http://www.digitalpad.co.jp/~takechin/ http://www2f.biglobe.ne.jp/~kana/develop.html

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.9

>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)
回答No.8

>BMPを読み込むにはどのようにしたらよいのでしょうか? 普通にバイナリで読み込むだけです。 fopenとかfstreamで。 「BMP ヘッダ」で検索すれば 関連サイトはいっぱい出てきます。

参考URL:
http://www.kk.iij4u.or.jp/~kondo/bmp/
noname#30727
noname#30727
回答No.7

Windows 上でのプログラミングでしたら、BMPを理解してしまうと応用が利きますので、私もそれをお勧めします。 ファイル構造は、基本的には BITMAPFILEHEADER + BITMAPINFO + ビットデータ になっているので、それぞれの構造体について検索エンジンなども併用して理解を深めていけば、読み込みと書き込みは、それほど難しくないと思います。 (無圧縮のとき以外は簡単ではないですが・・・) どんな画像フォーマットを使用するにしても、画像処理そのものはメモリ中で無圧縮のデータを扱うことになるでしょうから、画像処理がメインであれば、画像フォーマットは無圧縮の簡単なものでいいと思います。 JPEGなどは、画像を圧縮する為のものであって、WEBで配信するなどの目的には適していますが、入力も出力もロスありのJPEGにしてしまうと画質が下がってしまい、画像処理の結果を目で見て正しく判断できなくなります。

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.6

どういう画像処理を行いたいのかにも依りますが 一番扱いやすいのは 身圧縮で単純なBMPデータです。 BMPデータはヘッダに 画像の高さや幅、色数などの情報が書かれており その後にそれに沿ったバイナリデータが続いている 単純なものです。 BMP形式で処理し 保存時にJPG等に変換するとかでどうですか?

chaborin
質問者

補足

ありがとうございます。 BMPですかぁ。 BMPを読み込むにはどのようにしたらよいのでしょうか? 何か参考になる本やサイト、ありましたらお願いします。

  • zuntac
  • ベストアンサー率36% (45/124)
回答No.5

#3:zuntacです。参考資料にあげた本はJPEGエンコーダ、デコーダを実際のCのソースコード付きで解説しています。これは実際に動くプログラムなので、実例としては最適かと思います。まずは、このプログラムの中身を充分に理解することで広範囲に画像処理に必要な知識が身に付くと思います。ここで得られた知識を元にして、ほかのPNGやGIFなどについてもさらに情報を集めて勉強するのが得策でしょう。例えば、このエンコーダ、デコーダの拡張機能としてPNGやGIFを扱う機能を実装してみるなどして応用範囲を広げるなどしてみてください。Good luck!

chaborin
質問者

お礼

またまたありがとうございます。 1つの形式が扱えれば他の形式も理解しやすくなりますでしょうか??? まずはJPEGやってみますね。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.4

ごめんなさい! 今調べたら、Adobe.comからPhotoshop6.5SDKのダウンロードサイトが無くなってます。 どうやらAdobe Solutuin Network会員(会費有料)しか使えないみたいです。 昔はAdobe Photoshopに付属していたんですが、Photoshop7.0からは付属もなくなってます。 基本的にプラグインの概念は同じなので、他の画像処理ソフトのプラグインで画像処理を学ぶことは可能です。 Windows向け画像処理アプリケーションのプラグインSDKはほとんどの場合、Visual C++6.0対応です。 たまに、バージョンの古いVC++を要求してくる物がありますが、Visual C++は旧バージョンのプロジェクトを変換して新バージョンに対応させる機能を持っているので大丈夫です。

chaborin
質問者

お礼

またまたありがとうございます。 プラグインSDK.....。 またわからない言葉が出てきましたねぇ。 しらべます。 プラグインというのはどのような位置にいるものなのかがよくわかってないんですよね。

  • zuntac
  • ベストアンサー率36% (45/124)
回答No.3

画像処理についての基本的な勉強をかなりする必要があります。C言語を一通りやってみただけでは、大きな処理を行うプログラムを書く、つまり機能別にいくつかのファイルでモジュールを構成するというような手法が身に付いていないと思います。画像ファイルの入出力、画像の処理の理論、記述テクニックなどの修得も必要です。参考URLにあげた本はこれらの技術の勉強に最適です。ここではJPEGファイルの入出力、JPEGによる圧縮、解凍に必要なテクニックが全てCのソースコード付きで解説されてます。初めてだとチトつらいかもしれませんが、これがものにできればかなりの技術が身に付きます。頑張ってください。

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4797306327/qid%3D1059552176/249-5794426-5486718
chaborin
質問者

お礼

本の紹介ありがとうございます。 ファイル形式についてはJPEGが扱えるようになれば、ほかのPNGやGIFなども扱えるようになるのでしょうか? とりあえずは「画像ファイルの入出力」をできるようにしたいので、紹介してくださった本を探してみようと思います。

  • ginyou
  • ベストアンサー率32% (138/431)
回答No.1

基本はBMPですね  あとGIFは著作権の問題がありますので、やめといたほうがいいでしょうね  後はJPEGがいっぱんてきでしょうね。

chaborin
質問者

お礼

基本はBMPなのですか? BMPは少々難しいと聞いています。 JPEGが身近に知っているので、JPEGでやっていきたいです。

関連するQ&A

  • C言語 画像処理 jpeg → pgm

    C言語 ( visual studio 2010 ) を使っております。 今回C言語で画像処理を行いたいです。 使用目的としましては、実際にデジカメでとった写真について使いたいのですが、デジカメで撮った写真はjpeg形式の為、これをpgm形式に変換したいのです。 しかし、プログラミング経験がほとんど無いため、どのようなプログラミングを作成してよいのか解りません。 一応、新版 明解C言語 入門編(出版社: ソフトバンククリエイティブ)は読んだのですが、作成できませんでした。 お教えいただけないでしょうか。 よろしくお願い致します。

  • C言語での画像処理:jpeg→pgmへ

    Linux(Fedora core 4)を使っております。 今回C言語で画像処理を行いたいと考え、画像の形式がpgm形式としてのプログラムを組みました。 このプログラムを、実際にデジカメでとった写真について使いたいのですが、デジカメで撮った写真はjpeg形式の為、これをpgm形式に変換したいのですが、これはプログラムを作って行うことはできるのでしょうか。もしくはツールが必要なのでしょうか。ちなみに当方プログラミング初心者でございます。 よろしくお願い致します。

  • C++ 画像処理

    C++で画像処理を行おうと思っています。 当初jpegの入出力を試す予定でしたが、検索しても出てくるのがbmpばかりで標準関数はjpegに対応していないのかなと思いました。 C++の画像処理全般に関して詳しく紹介しているサイトや本などはありませんでしょうか。

  • 画像のファイル形式の違いについて

     画像のファイル形式って、たくさんあって、違いがよくわかりません。JPEG,TIFF,BMP,PICT,GIF,PNGって具合にほんとたくさんあって、困ってます。  それぞれがどのように違うのを教えてください。たぶん、圧縮の仕方が違うだと思うのですが。本とか、ホームページとかも教えてくれたら嬉しいです。

  • .pngの画像ファイルについての質問

    自分は今まで、画像ファイルを(画質は落ちるが)容量を小さく保存するのは.jpeg方式だと思ってました。それ以外は、bmpとgifしか知りませんでした。最近.pngの拡張子の画像を見かけるようになったのですが、これは新しい画像の保存形式でしょうか?.pngは.jpegよりも高画質の小容量で保存できますか?だとすると、どうやって.jpegや.bmpを.pngに変えられるのでしょうか?(ソフト使用ですか?)

  • java で画像保存

    ちょっと、お聞きしたいのですが、 僕はjavaの初心者なんですが、どの入門書を見ても、画像の保存の仕方が載っていません。 (FileChooserクラスとかは、ありますが・・・) jpeg,png,xpm,gifなど、様々な画像形式があるのですが、それらの形式で、 保存するには、どうすればいいのでしょうか? 難しいアルゴリズムを自分で、書かなくてはならないのでしょうか? 画像形式を一括して、サポートしているパッケージまたは、クラスがあるのでしょうか? どうか教えてください。宜しくお願いします。

  • C言語等での画像処理の勉強方法

    画像処理をしたいがためにCを勉強中のものです。 新版 明解C言語 入門編 (単行本) 柴田望洋 (著) を読んでCの基礎を学んだのですが、画像処理については一切触れらていませんでした。 これからC言語で画像処理の勉強をするに当たって分かりやすい本やサイトがあれば教えてください。

  • Wordでの画像の透明化処理。

    Wordに図を挿入し、「図」ツールバーより、「透明化に設定」ボタンで、背景を透明にする機能がありますが、 一部のパソコンで、「bmp」形式の画像のみ処理がされないものがあります。「jpeg」や「gif」に変換した画像であれば問題ないのですが・・・。他の台では、「bmp」でも透明化できます。何が違うのでしょうか?また、どうしたら透明化できるようになるのでしょうか?ご存知の方がありましたら、ぜひ教えてください。

  • 画像の種類?

    画像にはいろんな種類がありますよね? gifとかjpegとかbmpとか。 pngっていうのを携帯の待ち受け画像でよく見ます。 この「png」というのに読み方はあるんですか? (gifならジフとかjpegならジェイペグとか・・・) また画像的にはgifよりも軽く、質もgif以下なんですか? あと、他にも種類あればその読み方なども教えてください。 とても基本的な事でスミマセン。教えてください。

  • 画像の保存形式について

    指定した画像等を切り取ってブログに貼りたいと思い、 キャプチャーソフトをダウンロードしました。 よく、画像(写真ではなく)を見ると、「BMP」や「GIF」が多いですが・・・ 私がダウンロードしたソフトは「GIF」形式にはできません。 しかも、ブログは『FC2』で、「BMP」はできません。 ダウンロードしたソフトに「PNG」があるのですが、 この形式ってあまり見た事ないけど、大丈夫でしょうか? 切り取りや、バナーってほとんどが、「BMP」や「GIF」で、「PNG」は使われてないですよね? 切り取りたい画像はサイトの一部です(例ビンゴとか) 「PNG」を使用しても問題はないでしょうか? 宜しくお願い致します。