2009-03-04 4 views
11

私は最初にそれらをデコードせずに無損失で多くのjpegを一緒に結合するプログラム(javaでprob)を書こうとしています。16進エディタを使用してデコードせずに無損失で2つのJPEGを結合するにはどうすればよいですか?

私は簡単に始めて、同じサイズの2つのjpegを16進エディタを使って上下に同じ設定で圧縮しようと考えました。

最初にjpeg Bの画像データを抽出し、それをjpeg Aに追加します。ヘッダーで指定されたサイズを変更すると、表示可能な新しい認識可能な画像(ypeg A + jpeg Bがy軸に追加されます) 。しかし、JPEG Bからの画像データははっきりと認識可能ですが、多くの色情報が失われているように見え、明らかに間違っています。

ここで私の質問はどのような措置ですか?変更する必要のある他のディメンション固有のヘッダー値はないと思うので、両方のjpegから画像データをデコードし、それらを一緒に追加してから、再エンコードする必要がありますか?

私はjpegのスペックやヘッダーなどを読んで時間を費やしましたが、正直言って私は自分の奥行きから外れています。

ありがとうございました。


ありがとうございました。はい、これは間違いなく可能です。私は元の質問にjpegtranについて言及していたはずです。私は基本的にjpegtranの機能のこの側面を再現しようとしていますが、自分のプログラムでそれを使用しています。私はjpegtranのソースを見なければならないと思うが、私はCについては何も知らず、一般的なプログラミングについてはあまり知らないので、リバースエンジニアリングのソースコードは簡単だと言われている!

+1

これは、最初の画像の幅(または高さ)が16の倍数(他の画像を追加する場所によって異なる)である場合にのみ有効です。それ以外の場合は、ブロックの途中で終了し、もう一方のピクチャを再エンコードする必要があります。 –

答えて

3

私は間違っていたところで働いていました。

1)イメージスキャンデータはバイト単位で保存されますが、実際の重要な情報は可変長のビット列としてエンコードされます。これは、実際の画像データの終わりが必ずしもバイト境界に収まるとは限らないことを意味する。 jpegエンコーダがバイト境界を作るためにビット数をパディングする必要があるときは、単純に一連の1を加算します。

2)実際のピクセル情報が格納される方法は(少なくとも私にとっては)説明するのが少し複雑すぎますが、基本的にすべてがMCU、最小限のコーディング単位などにエンコードされています。これらは、クロマサブサンプリングに応じてサイズが異なり、水平および垂直サイズは8または16ピクセルのいずれかです。各MCUには、輝度、Y、クロミナンス、Cb、Crの1つのコンポーネントを構成するDCとACの部品があります。問題は、DCコンポーネントが、前のMCUの関連するDC値に関連して値として格納されることでした。そこで、jpg Bから新しい画像データを追加したとき、そのDC値は0に関連して保存されていました(以前のMCUがなかったため)が、最後のMCUのDC値をjpg Aから考慮する必要がありました。 (意味があることを望む)。

ソリューション:

あなたは画像データが終了する場所を正確に見つけ出し、その後、末尾の1秒を取り除くために、画像データの最初のデコード(ハフマン+ランレングス)を行う必要があります。また、2番目のjpgの初期DC値を適切に変更する必要があります。次に、適切なビットを再符号化し、バイト境界に合わせて1を追加する必要があります。

x軸に追加する場合は、少し複雑です。正しい順序でスキャンするようにMCUを再配置する必要があります。 Jpgは左から右にスキャンし、次に上から下にスキャンし、DC値を適切に調整します。

これまでのところ、私はこれを単一のMCU jpgでテストしましたが、理論的にはより大きなものでも動作するはずです。

はところで私は、私はこれが前提条件の多くを必要とするが、あなたが、DRIとRSTNマーカーを検討することをお勧めこの excellent jpg related resource/blog

-3

ロスレスJPEG処理はかなり矛盾しています。あなたは回転のようなトリッキーなことができますが、それはかなりです。

ロスレスソースイメージ(TIFFまたはPNGが心に浮かぶ)があるか、イメージ品質の要件を再評価することをお勧めします。元のファイルがあれば、JPEGをもう一度リサンプリングし、大部分のものと区別できません。そこにいる人々。

+0

いいえ、無損失の操作も可能です:http://en.wikipedia.org/wiki/Jpeg#Lossless_editing –

2

jpegはmp3のようなもので、同じアルゴリズムを使用して再圧縮すると安定します。

画像を結合して再圧縮するときは、新しい圧縮率が2枚の写真の最高値よりも高いか等しいことを確認してください。あなたは本当に正確さを失うことはありません。

+0

ありがとうございました。私はそれを知らなかった。私はこの作業を無損失にしたいと思っていますが、ロスレス操作が不可能なときにこれをデフォルトにすることができます。 – joinJpegs

-4

基本的にはできません。
JPEGファイルのエンコーディングはやや複雑です。ピクセルの内容を変更する場合は、エンコーディングが変更されます。あなたが結合する2つの画像の合計よりも小さいか大きい画像で終わるかもしれません。 無損失で可能な操作は、元の画像のピクセルと1対1の対応を維持する操作だけです。これは基本的に90度の回転にまで沸騰します。

+2

16x16ピクセルブロックを他の位置(16/16の倍数)に移動するには、無損失の方法で行うこともできます。http://en.wikipedia.org/wiki/Jpeg#Lossless_editing –

+0

はい、非常に便利になります。 – shoosh

2

二つのアプローチ:

1)、両方のソースJPEG画像を復号結果のビットマップをマージし、JPEGとして再エンコード。ここでの短所は、再圧縮です。

2)ソースイメージの幅と高さが16の倍数であることを確認してください。可能であれば、イメージをトリミングしてください。画像をデコードせずに、ターゲットのJPEGをソースMCUブロックからアセンブルします(16 x 16ピクセルのサイズ、したがってトリミング)。

+0

2)基本的に私がやろうとしていることですが、うまくいかないのです! – joinJpegs

19

これは非常に実行可能です。私はそれらを結合し、ポスターサイズの画像を形成するために、多くのGoogleマップ画像タイルでそれを行いました。これを行うためのUnixのためのパッケージがあります。プログラムはjpegjoinと呼ばれます。純粋なCソース、Windows binariesが利用可能です。コンパイルするとコマンドラインアプリケーションが作成され、実行時に2つのjpegイメージが無限に多くのものに結合されます。画像を圧縮解除するのではなく、圧縮されたデータをマージし、それに応じてヘッダを修正するだけです。私はそれを使用して50のストリップを作成するために100のイメージをマージし、次にそれらのストリップをマージして大きなイメージを作成しました。基礎となるjpegtranライブラリのソースコード

ソースコードがhere見つけることができます

http://en.wikipedia.org/wiki/Lossy_compression#Lossless_editing

詳しい情報は見つけることができます。 jpegjoinを模倣するスクリプトの例は、hereです。

+0

[Jpegjoin](http://jpegclub.org/)は独自のWindows実行ファイルを公開し、シルバナバイナリは同一です。 –

+1

jpegjoin.cに直接リンクできますか?私が見つけることができるのはWindowsのバイナリです...ありがとう! –

+0

上記のリンクされた現在のJpegjoin.exeはGUIアプリケーションのようですが、余分なスペースを追加せずに異なる高さのJPEGを処理するようには見えません。私は3つ以上の部品がある場合それはまた、混乱するようです。 (私は幸運にも私のプロジェクトでこれを回避することができました。すべてをつなぎ合わせて埋め込みを行い、後で埋め込みを切り捨てることによって)。 – trlkly

1

の所有者に感謝し、これを働いたが、それは私の作品:PPMを(追加しますビットマップ形式)を、DRIとRSTnを使用してエンコードされたjpegに変換します。どちらも同じ幅であり、両方ともMCUの倍数です。

最後のRSTnマーカー(ある場合)の後にjpegデータを切り取り、これをPPMにデコードし、2つのPPMを1つのMCUラインに結合し、オリジナルのjpegと同じオプションでエンコードし、オリジナルのjpegに従って結果のjpegのRSTを作成し、その結果を元のjpegに追加します。 この方法を使用すると、元のjpeg全体をデコードして再度エンコードすることができなくなります。

私はlibjpegを使用しています。

0

イメージを水平に追加するのではなく、各イメージを90度回転させてから垂直に結合し、結果イメージを-90度回転させる方が簡単でしょう。

関連する問題