2

新しくコンパイルされた libjpeg バージョン 9 があり、引数を使用してコマンド ラインで jpegtran.exe を実行しようとしました。

.\jpegtran.exe -rotate 180 -outfile test_output1.jpg testimg.jpg

testimg.jpg: 前test_output1.jpg:後

ご覧のとおり、画像は回転しますが、クリップされ、正しくまとめられていません。パッケージに付属の usage.txt ファイルは完全に最新のものではありません。

jpegtran は、cjpeg や djpeg と同様のコマンド ライン構文を使用します。Unix ライクなシステムでは、次のように言います。

  • jpegtran [スイッチ] [入力ファイル] >出力ファイル

Unix 以外のほとんどのシステムでは、次のように言います。

  • jpegtran [スイッチ] 入力ファイル 出力ファイル

ここで、入力ファイルと出力ファイルの両方が JPEG ファイルです。

出力ファイルで使用されるコード化された JPEG 表現を指定するために、jpegtran は cjpeg によって認識されるスイッチのサブセットを受け入れます。

  • -optimize エントロピー エンコーディング パラメータの最適化を実行します。
  • -progressive プログレッシブ JPEG ファイルを作成します。
  • -arithmetic 算術コーディングを使用します。
  • -restart N 数値に「B」が付いている場合は、N MCU 行ごと、または N MCU ブロックごとに JPEG リスタート マーカーを出力します。
  • -scans file 指定したテキスト ファイルで指定されたスキャン スクリプトを使用します。

これらのスイッチの詳細については、cjpeg の前の説明を参照してください。これらのスイッチを何も指定しない場合は、プレーンなベースライン JPEG 出力ファイルが得られます。品質設定などは、入力ファイルによって決まります。

次のいずれかのスイッチを指定することで、画像を可逆変換できます。

  • -flip horizo​​ntal ミラー イメージを水平方向 (左右) に反転します。
  • -flip vertical イメージを垂直にミラーリングします (上下)。
  • -rotate 90 画像を時計回りに 90 度回転します。
  • -rotate 180 画像を 180 度回転します。
  • -rotate 270 画像を時計回りに 270 度 (反時計回りに 90 度) 回転します。
  • -transpose イメージを転置します (UL から LR 軸に沿って)。
  • -transverse 横方向の転置 (UR から LL 軸に沿って)。

奇妙なことに (あるいはそうでないかもしれませんが)、実行する.\jpegtran.exe -rotate 180 -outfile test_output2.jpg test_output1.jpgと、クリッピングの問題なしに元の画像が返されます。クリップされた部分を反転していますが、画像の残りの部分と正しく並べていません。

test_output2.jpg:さらに180回転

jpegtran.exe -rotate 902回実行しても同じ結果が得られます。

また、より大きな .jpg ファイルで試してみたところ、同じ問題が発生しましたが、出力のファイル サイズは 18 KB 小さくなりました。問題はこれに関連していると思います。


編集-問題を説明していると思われるこの宣伝文句も見つけました:

奇数サイズの画像を変換するときの jpegtran のデフォルトの動作は、変換セットの正確な可逆性と数学的一貫性を維持するように設計されています。前述のように、転置は画像領域全体を反転できます。水平ミラーリングでは、右端の部分的な iMCU 列はそのまま残りますが、画像のすべての行を反転できます。同様に、垂直ミラーリングでは、下端の部分的な iMCU 行はそのまま残りますが、すべての列を反転できます。他の変換は、転置操作と反転操作のシーケンスとして構築できます。一貫性を保つために、エッジ ピクセルに対するそれらのアクションは、対応する転置および反転シーケンスの最終結果と同じになるように定義されています。

-trim スイッチは、それを呼び出すことができれば機能し、整理されていないデータを削除しますが、画像は小さくなり、データが失われます。

test_output5.jpg:トリミングされた出力

上記の発生を停止すると思われる -perfect スイッチを追加するとtransformation is not perfect、出力と画像なしの結果になります。

では、.jpg を無損失で回転することはできませんか? 私自身、ペイントに入り、エッジラインを正しい場所に移動するだけで元のイメージを再構築できました. libjpeg内でこれを行う方法はありますか?

4

1 に答える 1

2

無損失回転は、JPEG ファイル内に含まれる DCT ブロック全体で機能します。これらのブロックは、常に 8x8 または 16x16 ピクセルです (圧縮ダウンサンプリング設定によって異なります)。ファイルには幅と高さが含まれているため、画像がデコードされるときに余分なピクセルを捨てることができますが、クリッピングを右/下端から左/上端に移動する方法はありません。ソフトウェアは、不可能な問題に対して最善を尽くしています。

この問題を回避する方法は、幅と高さを 16 で割り切れるようにすることです。たとえば、カメラからの画像にはこのプロパティがあることがわかります。

于 2013-01-30T21:06:00.313 に答える