- 締切済み
画像ファイルの編集の方法
画像にはいろんなフォーマットがありますが、ソフトウェアを使うとフォーマット変換ができます。そこで例えばビットマップに変換できたとします(変換には不可逆とか不可逆の圧縮とかありますが、そこはとりあえず不問で)。 そこでプログラムによってビットマップを何らかの方法で数値として取り出し、編集してまた元に戻すことを考えています。これが自在にできると大きな自由度を得ることができます。ビットマップですから平面に展開された数値(RGB値?)だと思います。編集作業が一番難しいのでしょうが、プログラムを駆使して何かができてそれを元に戻すと編集後の画像が再構成されます。このようなことを実行する方法はC++とかJAVAなのかなと思うのですが、実際どのようにして行うことが可能でしょうか。そのようなテンプレートのようなプログラムがあると助かるのですが。画像ファイルのヘッダーなどは形式によって決まっているのではないかと思いますが。なお、できるのであれば形式はビットマップでなくてもいいです。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- asciiz
- ベストアンサー率70% (6803/9674)
>Fortran+Imagemagickの取り合わせは可能なのでしょうか。 Fortran用には、ImageMagickライブラリは無いようですね…。 Pythonならば、PythonMagick という名前でライブラリが作成されているようです。 いっそのこと、Fortranは忘れて、コマンドラインでファイル名指定して画像操作する方が良いように思います。 OSには何を使っているのでしょうか。 unix、linux、mac OS X、Windows、であれば、すぐに利用できる実行ファイルをダウンロードできます。 その他のOSの場合は、ソースからビルドすれば使えるかもしれませんが…。 ところでいったいどんな画像処理をしたかったのでしょうか? 利用環境(OS)には何をお使いで?
- asciiz
- ベストアンサー率70% (6803/9674)
ビットマップファイルは、すでに数字の塊です。 ファイルの頭から、何バイト目と何バイト目はどういう意味を持ち、データ部ではRGBそれぞれの輝度が数値になって各ラインごとにズラッと並んでいる、というような「フォーマット」が決まっています。 ですから、「(*.bmp)ファイルをフォーマットに従って読んで」→「ピクセルデータを加工して」→「ファイルフォーマットに沿って保管」、ということをすれば、画像処理ができることになります。 >Bitmapファイルフォーマット >http://www.umekkii.jp/data/computer/file_format/bitmap.cgi JPEGデータでは、上記のようなものに、「データ圧縮」と「情報のセグメント化」がが追加されています。 Bitmapでは、ヘッダにあるデータのほかは画素データしかありませんが、JPEGファイルには画素以外のデータを保持するブロックを作ることができ、デジカメでは撮影日時や絞り・シャッタースピード等を記録した「EXIFデータ」として活用されたりしています。 >JPEGファイルの構造 >https://hp.vector.co.jp/authors/VA032610/JPEGFormat/StructureOfJPEG.htm JPEGファイルを直接扱おうとすれば、JPEGデータの展開方法までプログラミングしなくてはいけません。 そしてJPEGにはベースラインJPEGとプログレッシブJPEGの違いや、JPEGバージョンによって追加されていった規約などもあり、自分だけでそういった規約に沿ったプログラムを作り上げるのは結構大変です。 また、JPEGよりはGIFの方が簡単かもしれません。 >GIFフォーマットの詳細 >http://www.tohoho-web.com/wwwgif.htm ビットマップデータよりは多少圧縮できますが、色数は最大256色と、ビットマップに劣る部分もあります。 また、データ格納順序を工夫したインターレースGIFで概形を早く表示し始められたり、アニメーションGIFの仕様が決まっていて画像ファイル1つでちょっとした動きを表現できたりもします。 何事も勉強ですから、自分で画像フォーマットを解析して表示するプログラムを書いてみるのは面白いと思います。 ---- ただ、実用的なプログラミングでは、「画像操作ライブラリ」を使うのが一般的です。 その中でもいろんなOS・言語に対応しているのが「ImageMagick」。 →https://imagemagick.org/index.php まあいきなり英文マニュアルを読むのも大変なので、Wikipediaで概要を見たり、日本語解説ページを検索したりして見てください。 >Wikipedia: ImageMagick >https://ja.wikipedia.org/wiki/ImageMagick ImageMagickライブラリを、自分で使う開発言語に取り込むことにより、 ・画像ファイルを指定し、「画像オブジェクト」として読み込む。 ・画像オブジェクトのプロパティから、画像のサイズ・色深度などの情報を読み取る。 ・画像オブジェクトのに対して、画像のサイズを変更する、変形する、特殊効果をかけるなど。その他もろもろの『画像操作』が可能。 ・画像オブジェクトを、任意のファイルフォーマットで保管する。 といったことができます。 ライブラリのおかげで、各画像フォーマットの詳細を知らなくても、マルチフォーマット対応の画像加工プログラムが書けてしまうことになります。 また、ImageMagickパッケージには、コマンドラインツールも含まれていて、ライブラリのインストール後に、OSのコマンドラインから <操作命令> <オプション> <読み込みファイル> <出力ファイル> みたいに実行することでも、簡単な画像加工なら出来てしまいます。 そうすると、C++やJavaみたいにコンパイルが必要な言語でなくとも、OSのバッチファイルでやりたい処理をずらずらと並べて画像加工することも可能です。 >ImageMagickの使い方日本語マニュアルImageMagick) >https://imagemagick.biz/ 上記ページは、コマンドラインツールとしてのImageMagickの使い方解説となります。 ただ、Windows環境で使う場合には少々注意が必要で、Windowsにはファイルシステムの変換をする「convert.exe」っていうプログラムが含まれているんです。 ImageMagickのメインツールである「convert.exe」と名前がかぶるので、C:\Windows\system32\convert.exe を、convertFS(ファイルシステム).exe みたいにリネームしておくのが安全かもしれません。
お礼
懇篤な回答ありがとうございます。大変参考になりました。画像ファイルはbitmap, GIFになるようにしてjpegはひとまず敬遠します。また、自分でプログラムを一から作るよりも画像処理のライブラリにようなもの(ImageMagickなど)を1枚介入させてやることがいいようです。OpenCVなどもそのようなことなのでしょうか。自分が日ごろから操作している言語ですが、Fortranなのです。Fortran+Imagemagickの取り合わせは可能なのでしょうか。あとはPythonとかも少々です。C++はコンパイラがあってHello worldを出力したりはしますが。 画像ファイルAがあって、それを開いて出力して別名で保存して画像Bができる、という流れは人に依存せず正しいプログラムが1つあればいいということになると思います。そして結局は開かれたファイルをどう編集するかが個人個人なのであってその前後(ファイルを開く・保存・閉じる)は標準ツールになっていればいいのではないかと思っているのですが。どうでしょうか。
- wormhole
- ベストアンサー率28% (1626/5665)
javaは、いくつかの画像ファイルの読み書きをサポートする標準ライブラリがありますし(javax.imageio.ImageIO等を調べて下さい)、 Cもそれらを行うライブラリが色々ありますけど。 最近でメジャーなのはOpenCVとか。
お礼
回答ありがとうございます。Windows、Linux(ubuntu)です。Macは全く使いません。 もともとの動機は写真測量に近いようなことです。複数台のカメラで取得した画像から直交座標での位置決めをできるところまでやるということです。技術系とか計測系に応用するということを考えていました。画像処理の本はCを対象としたものが多くあり、CDが付属していたものがありました。その辺をマスターしておけばよかったようには思っています。OpenCVは使いやすいのでしょうか。Cmakeのところでちょっとわからなくなったと感じています。 Fortranは一応何も参照しないでコードを書けるぐらいの自由度はもっています(微妙なところは本を見ますが、日本語でも辞書を引くのと同じです)。C,C++,Javaになるのだろうとは思っていたのですが。