Independent JPEG Group's JPEG software の使い方


目次

はじめに

これらのプログラムは、JPEG 画像の圧縮と展開を行ないます。 JPEG (ジェイペグと読む) は、 フルカラー画像とグレイスケール(モノクロ)画像のための標準化された画像圧縮法です。 JPEG は「実世界の」風景、 例えばスキャナーで取り込んだ写真などのような画像を扱うことを念頭に設計されています。 漫画のような絵や線画などの「非現実的な」画像は、JPEG にはまったく向いていません。 そのような画像では、JPEG は非常に低い圧縮率しか示さないか、 もしくは画像品質が目に見えて悪くなってしまいます。

JPEG は非可逆圧縮です。つまり、 出力画像(展開された画像)は入力画像(元々の画像)とは必ずしも同じではありません。 そのため、出力画像が入力画像と全く同じでなければならない場合には、 JPEG を使うべきではありません。しかし、典型的な(実世界の)風景画像では、 見た目ではさほどの画像劣化はなく非常に良い圧縮率を得ることができます。もし、 画像品質が低くてもよいのなら、さらに高い圧縮率で圧縮することも可能です。 画像品質とファイルサイズは、 圧縮時の quality 値で調節(トレードオフ)することが可能です。

一般的な使用法

JPEG 画像の圧縮と展開には、cjpeg / djpeg という 2つのプログラムを使います。cjpeg は、画像ファイルを JPEG 形式に圧縮します。 djpeg は、JPEG ファイルを展開して一般的に使われている画像形式に戻します。

基本的なコマンドラインは、

cjpeg [スイッチ] (圧縮する)画像ファイルのリスト ...

または、

djpeg [スイッチ] (展開する)JPEGファイルのリスト ...

コマンドライン上にリストされたファイルが、それぞれ、圧縮/展開されます。 入力ファイルは変更されません。 出力は、拡張子を除いて入力ファイル名と同じファイル名で書き出されます。 cjpeg は出力ファイル名の拡張子として常に .jpg を使います。 djpeg は、スイッチで選択された出力画像形式に従って .bmp .gif .ppm .rle .tga のどれかを使います。

例えば、xxx.bmp を xxx.jpg に、yyy.ppm を yyy.jpg に、 それぞれ変換するとしましょう。その時は、以下のようにします。

cjpeg xxx.bmp yyy.ppm

ほとんどのシステムで、 入力ファイルの指定に標準的なワイルドカードを使うことができます。例えば、 DOS や Windows で djpeg *.jpg とすると、 カレントディレクトリにあるすべての JPEG ファイルが展開されます。

もし、出力ファイル名と同名のファイルが既に存在している場合には、 上書きするかどうかを尋ねるメッセージがでます。そこでもし「いいえ(n)」を選んだ場合は、 そのファイルの処理を跳ばして次のファイルへと進みます。

スイッチとファイル名を間に混ぜることもできます。一例を以下に挙げます。

djpeg -gif file1.jpg -targa file2.jpg

この例では、file1.jpg が GIF 形式に (file1.gif)、file2.jpg が Targa 形式に (file2.tga)、それぞれ展開されます。つまり、それぞれのファイル名の 「左側に」存在するスイッチだけが、そのファイルの処理に影響を与えます。 上の例のようにスイッチ同士が競合する場合には、 その競合するスイッチの中で一番右に存在するものが優先されます。

-outfile スイッチを使うことで、出力ファイル名を変更することもできます。

cjpeg -outfile output.jpg input.ppm

-outfile は、 そのスイッチよりも右に存在する最初の入力ファイル名に対してのみ働きます。

現在サポートされている画像ファイル形式は、PPM (PBMPLUS color format)・ PGM (PBMPLUS gray-scale format)・BMP・GIF・Targa・RLE (Utah Raster Toolkit format) の 6種類です。(RLE は URT library が利用できる場合のみ。 ちなみにこれは、DOS/Windows を含め、ほとんどの非UNIX環境では利用できません。) cjpeg は、いくつかの Targa 形式ファイルを除き、 その入力画像形式を自動的に認識します。 djpeg には、出力する画像形式を(スイッチを使って)指定しなければなりません。

※訳注: Version 6b 以降では、cjpeg での GIF 形式画像入力は利用できません。 また、djpeg での GIF 形式出力は「無圧縮 GIF ファイル」というものを作成します。 したがって、きちんと圧縮された GIF ファイルを作成したい場合には、 GIF 以外の形式で出力した後、他のソフトを使って GIF に変換してください。 cjpeg での圧縮の際も、一度 GIF 以外の形式に変換してから行なってください。

JPEG ファイルの形式は、事実上標準として広く使われている JFIF 形式です。 JPEG には他にも、あまり広くは使われていないマイナーなファイル形式も存在しますが、 このソフトではそれらはサポートされていません。

スイッチの名前は、短縮して指定できます。例えば -grayscale-gray とも -gr とも書けます。ほとんどの「基本的な」スイッチは、 1文字にまで短縮できます。大文字と小文字は区別されません(-BMP-bmp と同じ)。また、以下の説明では述べられていませんが、 英国式のスペルもOKです(たとえば -greyscale)。

CJPEG の詳細

cjpeg の基本的なコマンドラインスイッチは以下のとおり:

-quality N 指定された値にしたがって量子化テーブルの値を増減し、 画像品質を調節します。指定可能な値の範囲は 0(最悪)〜100(最良) です。 省略時の既定値は 75です。(詳細は後述)
-grayscale 通常のカラー画像から、モノクロ(グレイスケール) JPEG ファイルを作成します。 グレイスケール画像の入った BMP ファイルを圧縮する場合には、 必ずこのスイッチを使ってください。このソフトは、BMP ファイルに入っている画像が グレイスケール画像かどうかを自動的に検出することはできません。 -grayscale を指定すると、作成される JPEG ファイルも小さくなり、 圧縮/展開にかかる処理時間も短くなります。
-optimize エントロピー符号(Huffman 符号)の最適化を行ないます。 これを指定しない場合は、既定のエントロピー符号が使われます。 -optimize を指定すると、通常、 作成される JPEG ファイルが少し小さくなりますが、 cjpeg の圧縮処理がやや遅くなり、さらに多くのメモリが必要になります。 この指定は、画像品質と展開時の処理時間にはまったく影響しません。
-progressive プログレッシブ JPEG ファイルを作成します(詳細は後述)。
-targa 入力ファイルの形式に Targa 形式を明示的に指定します。 cjpeg の場合、ファイル中に identification フィールドのある Targa ファイルは、 自動的に(そのファイル形式を)認識することはできません。 そのような Targa ファイルを読み込む場合には、 入力ファイルを Targa 形式として扱うように明示的に指定しなければなりません。 そのほかのほとんどの Targa ファイルでは、このスイッチを指定する必要はありません。

-quality スイッチを使うと、 JPEG ファイルのサイズと画像品質とを調節(トレードオフ)することができます。 quality の値を上げると、JPEG ファイルのサイズも大きくなり、 出力画像(展開された画像)も入力画像(元々の画像)に近づきます。 普通は、見た目で元々の画像と区別がつかない画像になる quality で、 かつ、最も低い(最もファイルサイズの小さくなる) quality を使いたいでしょう。 この目的に適している quality の範囲は 50 から 95 です。中でも、 既定値(quality を明示しないときの値)である 75 が、ほぼ最適であることが多いでしょう。 もし、75 での画像があなたに適さないのならば、満足のいく画像が得られるまで、 一度に 5 か 10 ずつ quality を上げてみてください。 (最高の結果が得られる quality 値は、その画像によって変わることもよくあります。)

quality を 100 にすると、値がすべて 1 であるような量子化テーブルが生成され、 量子化段階での情報ロス(画質劣化)が最小になります。(しかしその場合でも、 数値の丸め誤差やサブサンプリング段階での情報ロスが依然として存在します。 つまり、100 でもロスレスにはなりえません。) この設定は主に、 (実用ではなく)実験的な目的において関心事となります。95 以上の quality 値は、 普通の使用目的においては全くお薦めできません。 JPEG ファイルのサイズが急激に大きくなるわりに、 その画像品質においてはほとんど利点がないためです。

逆に、quality を 50 以下にすると、その画像品質は低くなり、 ファイルサイズは非常に小さくなります。5 から 10 前後の quality は、例えば、 画像ライブラリの見本(見出し/インデクス)画像ファイルを作るのに使えます。また、 ちょっとした立体的効果を得るには、quality 2 (もしくはその前後)を試してみてください。 (注:quality を 25 未満にした場合、 JPEG のオプション規格となっている 2バイトサイズの量子化テーブルを使った JPEG ファイルを cjpeg は出力します。この形式のJPEG ファイルは、 他の JPEG 対応ソフトでは正常に画像を展開できない場合があり、 この場合 cjpeg はその注意を促すメッセージを出力します。もし、 そのような低画質設定の場合でも、 あらゆる JPEG 対応ソフトとの互換性を保つ必要があるならば、-baseline スイッチを併用してください。)

-progressive スイッチを使うと「プログレッシブ JPEG」形式の JPEG ファイルを出力します。このタイプの JPEG ファイルでは、 画像データが(上からの順ではなく)複数のスキャンに分解されてファイルに格納されます。 もしこの形式のファイルが低速な通信回線を通じて伝送されている場合、 デコーダ(表示ソフト)は、最初に受信したスキャンを元に荒い画像をまず表示し、 引き続いて受信されるスキャンによって画像を徐々に詳細化させることもできます。 最終的な画像は、同じ quality で圧縮した普通の JPEG ファイルのものとまったく同じで、 そのファイルサイズも近い(か、場合によっては少し小さい)ものになります。 注:プログレッシブ JPEG は、まだ広くは普及してはおらず、 プログレッシブ JPEG ファイルをまったく表示・展開できないデコーダも数多くあります。

※訳注:

これは、1995年頃の状況を元にした解説です。現在では、プログレッシブ JPEG に対応していないデコーダ(表示ソフト)の方が少ないでしょう。しかし、 プログレッシブ JPEG 形式は、もっとも基本的な JPEG 規格である Baseline JPEG の中には入っておらず、規格上では プログレッシブ JPEG は必ずしもサポートしなくても良いことになっています。

それと、プログレッシブ JPEG の順次表示は、 あくまでも「そういう表示方法も可能である」ということだけであって、 プログレッシブ JPEG 対応ソフトのすべてが順次表示をするわけではありません。 例えば Internet Explorer の場合、 プログレッシブ JPEG ファイルの受信中は一切の表示を行わず、 全データを受信し終えたところで画像全体を表示します。これじゃあ、 受信中に上部から順に表示される普通の JPEG ファイルの方がマシですね。

プログレッシブ JPEG では、 画像データを複数のスキャンに分解してファイルに格納しているため、 通常のシングルスキャン JPEG (ベースライン JPEG) では可能な、 JPEG ファイルを読み込みながら同時に画像を上から展開する、という方法が使えません。 プログレッシブ JPEG ファイルを展開する場合、まずファイルを読み込みながら画像データ (DCT係数データ)の再構成をしてメモリに一時的に記憶し、 そのあとにメモリにあるDCT係数データを読み出して画像を展開する、 という2段階の処理が必要となります。 このときメモリに記憶されるDCT係数データはかなりの量(1画素につき3バイト〜6バイト)になるため、 プログレッシブ JPEG の展開速度は、 コンピュータのメモリ周辺の性能(メモリの量や速度)によって左右され、 ほとんどの場合で シングルスキャンJPEG よりも遅くなります。 そのため、画像の展開速度が重要な場合は、 プログレッシブ JPEG の使用は避けた方が良いでしょう。 (※訳注ここまで)

高度なスイッチ:

-dct int
-dct fast
-dct float
高精度整数 DCT 演算を使用する(デフォルト)
高速整数 DCT 演算を使用する(精度は劣る)
浮動小数点 DCT 演算を使用する
これらのスイッチは、JPEG の圧縮処理で行われる DCT 演算の方法を指定します。 デフォルトは int です。浮動小数点 DCT は、高精度整数 DCT と比較して、 ごく僅かに正確な結果を出しますが、非常に高速な浮動小数点演算ハードウェア (FPU)を装備していないマシンにおいてはずっと遅くなります。また、 整数 DCT の場合は全てのマシンにおいて同じ結果(JPEG ファイル)が出るのに対し、 浮動小数点 DCT の場合は cjpeg を動作させたマシンによってもわずかに異なることがありえます。高速整数 DCT は、 演算精度の面では他の二つよりも劣ります。
(訳注:-dct fast の 高速整数 DCT は、 quality の設定が高いほど演算精度が悪化する欠点があります。実際には、 quality = 100 の場合でも見た目ではっきりわかるほどの画質劣化はありませんが、 特に高画質設定で圧縮する場合は使用しない方が良いでしょう。)
-restart N N は 0 以上の数値で、N MCU 行ごとに JPEG リスタート・マーカーを挿入します。数字の後ろに B が付加された場合は、 N MCU ブロックごとにリスタート・マーカーを挿入します。 -restart 0 (デフォルト) は、リスタート・マーカーを挿入しないことを意味します。
-smooth N 入力された画像を平滑化(スムージング)します。これによって、 ディザリング・ノイズを取り除くことができます。N は 1 から 100 の間の数値で、 平滑化の強さを表します。0 (デフォルト) は平滑化しないことを意味します。
-maxmemory N 大きな画像を処理するときに使用するメモリの総量を制限します。数値 N は、 1000バイト単位で表現したバイト数です。数字の後ろに M が付加された場合は、 1000000バイト単位になります。例えば、-max 4m は 4000000バイト を指定したことになります。もし、この制限よりもさらに多くのメモリが必要な場合、 一時ファイルが使われます。
-verbose
or -debug
デバッグ情報を出力します。このスイッチを複数回指定すると、 出力される情報も多く詳しくなります。また、起動した直後にバージョン情報を表示します。

-restart オプションを使うと、cjpeg は JPEG ファイル中にリスタート・マーカーを挿入するようになります。これは、 ファイルの途中で伝送エラーが発生した場合でも、 画像の展開を途中から再開できるようにする働きがあります。 リスタート・マーカーがない場合、圧縮データ(JPEG ファイル)の一部に損傷があると、 通常、その損傷箇所より後にある圧縮データをも正常に展開できなくなり、 結果的にその損傷箇所からファイルの最後までの画像データが破壊されてしまいます。 リスタート・マーカーがあると、 途中に損傷箇所があってもリスタート・マーカー以降のデータは正常に展開できるようになり、 破壊される画像データは、損傷箇所から次に現れるリスタート・マーカーまでに制限されます。 もちろん、リスタート・マーカーを挿入すると、その分のファイルサイズも増えます。 Usenet のような信頼性の低いネットワーク回線を通じて伝送される画像の場合、 -restart 1 を指定することをお薦めします。

-smooth オプションは、 画像中の細かいノイズを除去するためのフィルタを入力画像に対して適用します。 これは、ディザ(疑似階調処理)がかけられた画像を JPEG に変換する際にしばしば有効です。 10 から 50 程度の(適度の)スムージング・ファクタを指定することで、 入力ファイル中のディザリング・パターンを取り除くことができ、 結果的にファイルサイズが小さく画像の見た目も良い JPEG ファイルを作れます。 しかしながら、スムージング・ファクタを大きくしすぎると、 明らかにぼやけた画像になります。

JPEG の詳細に詳しい人向けのスイッチ:

-baseline 生成される量子化テーブルを、Baseline JPEG と互換性のある形式に保ちます。 つまり、低画質設定の場合においても、 量子化テーブル中の各数値が 255 を越えないように強制します。 (このスイッチの名前は本当は不適切です。なぜならこのスイッチは、 量子化テーブルの数値を制限するだけで、 出力ファイルが Baseline JPEG に完全に合致することを保証しないからです。 例えば、-baseline-progressive を同時に指定することも可能です。)
-qtables file テキストファイル file を与え、 その中で示された量子化テーブルを使用します。
-qslots N[,...] それぞれのカラー・コンポーネントについて、 どの量子化テーブルを使用するのかを明示的に選択します。
-sample HxV[,...] それぞれのカラー・コンポーネントについて、 サブサンプリング処理でのサンプリング比を明示的に指定します。
-scans file テキストファイル file を与え、 その中で示されたスキャン・スクリプトを使用します。

これらのスイッチ(wizard スイッチともいう)は、JPEG に関しての実験のためのもの です。これらのスイッチが何のためのものかわからなければ、これらのスイッチを使っ てはいけません。これらのスイッチのさらに詳しい説明は、wizard.doc にあります。

※訳注: これらのスイッチの中で、-sample だけは実用的な利用価値があります。 この -sample を特に指定しない場合のデフォルトは -sample 2x2 です。 一般的な画像ではこのデフォルト状態で十分なのですが、 本来は JPEG には不向きとされている CG 画像などを -sample 2x2 で圧縮すると、 いくら quality を上げても細部の色が消えたり滲んだりしているのが目立つ場合があります。 そういう場合は、JPEG ファイルのサイズが若干増えますが、 -sample 2x1-sample 1x1 で圧縮してみてください。

DJPEG の詳細

djpeg の基本的なコマンドラインスイッチは以下のとおり:

-colors N
or -quantize N
N は 8 から 256 の範囲の数値で、 出力画像の色数が N 色以下になるように減色処理します。したがって出力画像は、 カラーマップ・ディスプレイ(256 色表示モードなど)で直接表示できたり、 カラーマップ形式画像ファイル(256 色 bmp や gif など)で保存できるようになります。 (このオプションの名前は -colors を使うことを推奨します。 -quantize は、旧バージョンとの互換性のために残されています。)
-fast 高速展開・低画質出力の推奨動作オプションを選択します。 (デフォルトでは高画質出力の動作オプションが選択されています。) 現状では、これは以下の組み合わせと等価です。
-dct fast -nosmooth -onepass -dither ordered
-grayscale 展開される JPEG ファイルがフルカラー形式であっても、 グレイスケール(モノクロ)形式で画像を出力します。 これは、モノクロ・ディスプレイで画像を表示する場合などに有用です。 この場合、djpeg は目立って速く動作します。
-scale M/N 出力画像を M/N の比率に縮小します。現状では、 ここで指定可能な比率は 1/1, 1/2, 1/4, 1/8 の4つだけです。 この機能は、出力画像がディスプレイの表示サイズよりも大きい場合などに便利です。 またこの場合、djpeg はずっと速く動作します。
-bmp 出力形式として (Windows 形式の) BMP を選択します。 -colors-grayscale が指定されている場合、 もしくは展開される JPEG ファイルがグレイスケール形式である場合は 256色 BMP が出力され、 それ以外の場合はフルカラー BMP が出力されます。
-gif 出力形式として GIF を選択します。GIF は 256 色以上の色数をサポートしていないので、 この場合は (-colors を明示的に指定しない限り) -colors 256 が暗黙のうちに指定されます。また、-fast スイッチを指定した場合は(同様に) -colors 216 が暗黙のうちに指定されます。
-os2 出力形式として (OS/2 1.x 形式の) BMP を選択します。 -colors-grayscale が指定されている場合、 もしくは展開される JPEG ファイルがグレイスケール形式である場合は 256色 BMP が出力され、 それ以外の場合はフルカラー BMP が出力されます。
-pnm 出力形式として PBMPLUS (PPM/PGM) を選択します。 展開される JPEG ファイルがグレイスケール形式であるか -grayscale が指定されているならば PGM 形式で出力され、 それ以外の場合は PPM 形式で出力されます。
-rle 出力形式として RLE を選択します。(URT library が必要です。)
-targa 出力形式として Targa を選択します。 展開される JPEG ファイルがグレイスケール形式であるか -grayscale が指定されているならばグレイスケール形式で、 -colors が指定されているならばカラーマップ形式で、 それ以外の場合はフルカラー形式で出力されます。

高度なスイッチ:

-dct int
-dct fast
-dct float
高精度整数 DCT 演算を使用する(デフォルト)
高速整数 DCT 演算を使用する(精度は劣る)
浮動小数点 DCT 演算を使用する
これらのスイッチは、JPEG の展開処理で行われる(逆)DCT演算の方法を指定します。 デフォルトは int です。浮動小数点 DCT は、高精度整数 DCT と比較して、 ごく僅かに正確な結果を出しますが、非常に高速な浮動小数点演算ハードウェア (FPU)を装備していないマシンにおいてはずっと遅くなります。また、整数 DCT の場合は全てのマシンにおいて同じ結果(出力ファイル)が出るのに対し、 浮動小数点 DCT の場合は djpeg を動作させたマシンによってもわずかに異なることがありえます。高速整数 DCT は、 演算精度の面では他の二つよりも劣ります。
(訳注:-dct fast の 高速整数 DCT は、quality 設定の高い JPEG 画像ほど演算精度が悪化する欠点があります。特に quality が 100 に近いような超高画質設定の JPEG 画像の場合、その画像内容にもよりますが、 物体の輪郭部分に階段状の模様が浮き出たり、 色の変化が緩やかな領域に格子状の模様が浮き出たりする場合があります。 したがってこの -dct fast は、 画質を犠牲にして展開速度を少しでも高速化したい場合以外は使用しない方が無難でしょう。)
-dither fs
-dither ordered
-dither none
減色処理で Floyd-Steinberg ディザリング法を使う。
減色処理で Ordered ディザリング法を使う。
減色処理でディザリングを行わない。
これらのスイッチは、-colors スイッチで減色処理を行う際の疑似階調表現処理(ディザリング)の方法を指定します。 デフォルトでは、Floyd-Steinberg ディザリング法が使われます(-dither fs)。 これは、他の二つの方法よりも時間がかかりますが、通常は最良の結果を出します。 Ordered ディザリング法は、速度・結果(画質)を共に妥協したような方法です。 ディザリングなしでは、速度は高速ですが結果(画質)はお世辞にもよくありません。 なお、Ordered ディザリング法は -onepass モードのときのみ利用可能です。
-map FILE 画像ファイル FILE を与え、 そのファイル中で使われている色に合わせて減色処理を行ないます。これは、 同一のカラーマップ(パレット)を共有する複数の画像ファイルを作成する場合や、 あらかじめ定められたカラーマップに従って減色したい場合などに有用です。 FILE は GIF 形式か PPM 形式でなければなりません。 このオプションを指定すると、-colors-onepass は無視されます。
-nosmooth 高速展開・低画質出力のアップサンプリング・ルーチンを使用します。
-onepass 2-パスの減色法に代わり、1-パスの減色法を使用します。 1-パスの減色法は高速で、必要なメモリも少なくて済みますが、 出力される画像は 2-パスの場合に比べて劣ります。-onepass の指定は、 -colors N を(明示・暗黙を問わず)指定しない限り無視されます。また、 1-パス法はグレイスケール出力を行う場合にも常に使われます。 (この場合は 2-パス法を使う意味が全くないため。)
-maxmemory N 大きな画像を処理するときに使用するメモリの総量を制限します。数値 N は、 1000バイト単位で表現したバイト数です。数字の後ろに M が付加された場合は、 1000000バイト単位になります。例えば、-max 4m は 4000000バイトを指定したことになります。 もし、この制限よりもさらに多くのメモリが必要な場合、一時ファイルが使われます。
-verbose
or -debug
デバッグ情報を出力します。このスイッチを複数回指定すると、 出力される情報も多く詳しくなります。また、起動した直後にバージョン情報を表示します。

CJPEG の使う上でのヒント

カラーの GIF ファイル(訳注:GIF に限らず 256色以下の画像ファイル)は JPEG にとって理想の(良い)入力画像ではありません。 実際、JPEG はフルカラー画像(24-bit イメージ)を圧縮するためのものです。 特に、漫画や線画、いくつかのはっきりした色だけからなる画像は、 JPEG に変換しようとしないでください。GIF はこれらの画像に対して有効に働きますが、 JPEG はそうではありません。もし(本当に) GIF を JPEG に変換する場合は、 満足のいく変換結果を得るために、-quality-smooth の設定値を調節しながら、 前もって JPEG 変換の実験をすべきです。その場合、-smooth 10 (もしくはその前後) が役立つことが多いでしょう。

一つの画像に対して、JPEG の圧縮/展開を繰り返すことは避けてください。 圧縮/展開を繰り返すたびに画質劣化が蓄積されます。 10回前後も圧縮/展開を繰り返した後の画像は、 1度だけ圧縮/展開を行なっただけのものと比べて、目に見えて画質が悪くなってしまいます。 画像の操作(加工)を行なっているときはロスレスな(画像劣化のない)画像形式を使い、 加工を一切行わない段階になったら JPEG に変換するのが最も良い方法です。

cjpeg-optimize オプションは、公開や保存を目的とする「最終版」 のファイルを作成するときに利用価値があります。またこのオプションは、 低い quality 設定を使って小さい JPEG ファイルを作りたい場合にも使うと良いでしょう。 このオプションによるファイルサイズの減少率は、 (大きなファイルよりも)小さなファイルの方が高いことがたびたびあります。 (現バージョンにおいては、プログレッシブ JPEG ファイルを作成する時にはこの -optimize モードは常に有効になります。)

GIF ファイルの入力機能は、(現在では)もうサポートされていません。これは、 Unisys LZW 特許の問題を避けるためです。GIF ファイルを読む必要がある場合には、 Unisys から正式ライセンスを受けたプログラムを使ってください。(いずれにしろ、 GIF ファイルを JPEG に変換しようとすること自体が良い考えではないが。)

DJPEG の使う上でのヒント

画像のプレビュー(全体概要)を速く取得するには、-grayscale-scale のどちらか一方、またはこの両方を指定してください。-grayscale -scale 1/8 と指定すると最も速くなります。

画像の展開速度を上げるために敢えて展開画像の画質を下げるオプションもいくつかあります。 -fast を指定すると、(この速度重視の場合の)推奨設定になります。

-dct fast-nosmooth のどちらか一方、もしくはこの両方を指定することで、 画質低下を小さく抑えつつ、展開速度を上げることができます。減色済みの画像を得る場合は、 -onepass -dither ordered を指定することで、かなり画質は低下しますが、 動作を高速化することができます。2-Pass の減色モードの場合は -dither none (疑似階調表現処理なし) でも満足な画像が得られるかもしれませんが、1-Pass モード の場合は -dither none の展開画像が実用に耐えられることは滅多にありません。

もし、あなたが使っているコンピュータに、 非常に高速な浮動小数点演算ハードウェア(FPU)が装備されているのならば、 -dct float-dct fast よりも高速であることがあります。しかし、 ほとんどのコンピュータにおいては、-dct float-dct int よりも低速です。この場合は、-dct float を使う価値はありません。なぜなら、 -dct float の持つ、より理論的に正確な結果を出すという利点は、 実際にはさほど重要なものではないからです。(訳注:-dct int-dct fast でも、実用上では申し分のない計算精度を持っているため)

2-Pass の減色法を使う場合は、十分な空きメモリ容量が必要になります。 MS-DOS マシンにおいては、 -maxmemory 0 を指定してもメモリ不足になることがあります。この場合は、 1-Pass の減色法を使い(-onepass を指定する)、画質を多少犠牲にすることで、 画像を展開することは可能です。

Unisys LZW 特許の問題を避けるため、djpeg は GIF ファイルを "無圧縮 GIF" と呼ばれる形式で作成します。これは、 本来の GIF と比べてファイルサイズが大きくなりますが、 標準的な GIF デコーダで読み込めます。 (訳注:きちんと圧縮された GIF ファイルを作成したい場合は、 一度 BMP などの形式で出力した後、他のプログラムを使って GIF に変換してください。)

CJPEG/DJPEG に共通するヒント

もし、そのコンピュータで利用できるメモリの総量(もしくは -maxmemory で制限したメモリ量)よりも多くのメモリが必要になった場合は、 一時ファイルが使われます。(MS-DOS 版の場合は、一時ファイルが使われる前に、 拡張メモリ(EMS/XMSメモリ)を使おうとします。) この一時ファイルは、しばしば、 やや大きなものになります。典型的な場合で、1画素(1ピクセル)につき3バイトが必要になり、 例えば 800x600 の画像だと 3*800*600 = 1.44Mbyte にもなります。 もし(一時ファイルを作るのに必要となる)十分な空き容量がハードディスクにない場合は、 (cjpeg の場合は) -progressive-optimize を指定しないようにするか、 (djpeg で減色を行なう場合は) -onepass を指定するようにします。

※訳注: 上で述べられている一時ファイルのサイズは、 内部処理の関係で画像データのすべてを一時的にメモリに溜め込む必要のある場合の話です。 その必要のない場合は、数百Kbyte 以下のメモリ使用量ですみます。 なお、BMP 形式で入出力を行なう場合、その BMP ファイルの構造上、 どうしても画像データのすべてを一時的にメモリに溜め込む必要がありますので、 メモリ/ディスク容量が少ない場合は BMP 形式での入出力は避けた方が良いでしょう。

MS-DOS の場合は、 環境変数 TMP または TEMP で示されるディレクトリに一時ファイルが作られます。 この TMP, TEMP が両方とも未設定の場合はカレントディレクトリになります。 Amiga 版では、環境変数 JPEGTMP: で示されるディレクトリに一時ファイルが作られますので、 十分な空き容量のあるディスク・パーティションに JPEGTMP: を設定してください。

MS-DOS マシンでは、-maxmemory で指定する値は使用するメインメモリ(コンベンショナル・メモリ)の総量です。 (利用可能ならばEMS/XMSメモリも使われます。) このソフトウェアの DOS 版(のほとんど)では、 利用できるメモリ量を自動的に見積もって動作しますので、 通常は -maxmemory を指定する必要はありません。

※訳注: 各種 UNIX 系 OS や Windows (Win32) などで動作するバージョンでは、 ここで述べられているような一時ファイルはまったく使われず、 メモリは必要なだけいくらでも利用できるものとして動作します。 メモリの残りが少なくなったときの対処は、OS そのものが持っているページング機構 (メモリの内容を自動的にディスクに書き出してメモリを空ける仕組み)が受け持ちます。 もし、ディスクのページング領域(スワップファイルやスワップパーティション) を使い尽くしてしまった場合は動作を停止してしまいますので、 十分なページング領域を確保しておいてください。

JPEGTRAN

jpegtran は JPEG ファイルに対して各種の有用な変換/変形を行います。 これは JPEG ファイルのファイル構造(コード表現)を別種のものに変換することができ、 例えば、ベースラインJPEG と プログレッシブJPEG の相互変換などが可能です。 またこれは、画像データの再配置もいくつか可能で、例えば、 画像を回転して画像の縦横を入れ替えることなどもできます。

jpegtran は、画像を完全に展開することなく、 JPEG の圧縮データそのもの(DCT係数)を配置し直すことで動作します。なので、 jpegtran が行なう変換はロスレスです。同様の変換を djpegで展開→(画像変換)→cjpegで再圧縮 という手順で行なった場合、 JPEGの展開/再圧縮に伴って画質劣化が起こりますが、 jpegtran の場合は画像の展開/再圧縮は行わないため、画質劣化が起こりません。 同様の理由で、jpegtran は画像の quality の変更など画質劣化が伴うデータ操作は行なうことができません。

jpegtran のコマンドラインの形式は、

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

入力ファイル名出力ファイル名 は両方とも明示的に指定する必要があります。ファイルを直接変更しようとして、 入力ファイルと出力ファイルに同じ名前を指定しないでください。 ほとんどのシステムでは、単にファイルが破壊されてしまうだけになります。

※訳注: この jpegtran では、ワイルドカードによる複数ファイル指定はできません。 MS-DOS や Windows で、複数のファイルに対して同じ変換をしたい場合は、 例えば以下のようにします。
mkdir _out
for %i in (*.jpg) do jpegtran [スイッチ] %i _out\%i
バッチファイルの中では %i%%i に変更します。この例では、 カレントディレクトリの中のすべての JPEG ファイルがそれぞれ jpegtran で処理され、出力ファイルが入力ファイルと同じ名前で _out ディレクトリに出力されます。

出力ファイルの JPEG ファイル構造(コード表現)を指定するには、 以下に挙げる cjpeg と同様のスイッチを指定します。

-optimize エントロピー符号(Huffman 符号)の最適化を行ないます。
-progressive プログレッシブ JPEG ファイルを作成します。
-restart N N MCU 行ごとに JPEG リスタート・マーカーを挿入します。 数字の後ろに B が付加された場合は、 N MCU ブロックごとにリスタート・マーカーを挿入します。
-scans file file の中で示されたスキャン・スクリプトを使用します。

これらのスイッチの詳細については、前述の cjpeg の解説を参照してください。 もしこれらのスイッチのどれも指定されていない場合は、 普通の ベースライン JPEG ファイルが出力されます。quality の設定など、 そのほかの圧縮設定は入力ファイルのものと常に同じになります。

上述のスイッチと一緒に、以下のスイッチを一つ指定することで、 画像をロスレスに(画質劣化なしに)変形することができます。

-flip horizontal 水平方向に(左右を)反転する
-flip vertical 垂直方向に(上下を)反転する
-rotate 90 時計方向に90度回転する
-rotate 180 180度回転する
-rotate 270 時計方向に270度(反時計方向に90度)回転する
-transpose 転置(左上−右下の対角線を軸にして反転)する
-transverse 逆転置(右上−左下の対角線を軸にして反転)する

以上の変形のうち、転置(-transpose)については、 画像サイズに関する制限は一切なくどの画像にも適用可能です。 それ以外の変形処理については、 対象画像のサイズによっては若干変則的な処理内容になります。具体的には、 その画像の縦/横のサイズが iMCU (JPEG 圧縮の処理単位で、普通は 8 か 16) の倍数でない場合は、 iMCU を満たしていない右端/下端の領域は変形処理の対象から外されてその場にそのまま残され、 iMCU を満たしているそのほかの領域のみが変形処理されます。 このような変則的な方法をとる理由は、この種の変形処理は iMCU を満たしているデータブロック(DCT 係数データ)にしか適用できないからです。

サイズが半端な画像を変形処理するときの jpegtran の通常の振る舞いは、 続けて相反する変形処理を行なったときに画像が完全に元に戻るように、また、 図形変形操作についての数学的な(幾何学的な)一貫性を失わないように設計されています。 前述したように、転置処理については常に画像の全領域に対して適用可能です。 水平反転処理については、iMCU を満たしていない右端の領域をそのままその場に残しますが、 そのほかの領域はすべて反転できます。同様に垂直反転処理については、 iMCU を満たしていない下端の領域をそのままその場に残しますが、 そのほかの領域はすべて反転できます。そのほかの変形処理は、 理論的に転置/水平反転/垂直反転の3つの組み合わせで実現できます。 実際には jpegtran は、 回転などの処理を転置/反転の組み合わせではなく直接処理しますが、理論的な一貫性を保つため、 右端/下端の領域については転置/反転を組み合わせた場合と同じ結果を出力します。

実際の使用においては、 このような変形できない右端/下端の領域を奇妙な形でその場に残しておくよりは、 その領域を切り落としてしまった方が良いかもしれません。 これを行なうには、-trim スイッチを併せて使います。

-trim 変形できない右端/下端の領域を切り落とす

切り落とすという操作から明らかなように、 サイズが半端な画像を -trim スイッチを使って変形した場合、 相反する変形処理を続けて行なっても元の画像には戻りません。 なので厳密に言えば、-trim スイッチを使った変形はロスレス変換ではありません。 また、変形操作の間に成立している数学的な(幾何学的な)同等性も維持されません。 例えば、サイズが半端な画像を -rotate 270 -trim で回転すると下端の領域のみが切り落とされますが、 -rotate 90 -trim に続けて -rotate 180 -trim という処理をすると右端/下端の両方の領域が切り落とされます。

※訳注: 世の中に多く出回っている「JPEG ロスレス変形」機能を持つソフトの場合、 常にこの -trim モードで変換されるものが多いようです。 なお、ディジタルカメラなどの画像機器が出力する JPEG ファイルの場合、 その画像サイズは大抵の場合 iMCU の整数倍になっていますから、 この場合は切り落とされる領域は無く真のロスレス変換が可能です。ですが、 何か重要なファイルをこの方法で変形する場合、 画像のサイズが変わっていないか(ロスレスに変形されているか)を、 その都度確認した方が良いでしょう。

他にも、これも厳密に言えばロスレスではないけれども、以下の画像変換スイッチが あります。

-grayscale モノクロ(グレイスケール) JPEG ファイルを作成します。

入力画像が YCbCr カラー(これは標準的なフルカラー JPEG です)のとき、 このオプションを指定すると、画像データから色成分データ(Cb,Cr)を削除し、 輝度成分データ(Y)のみをそのまま残します。従って、最終的に得られるのは グレイスケール JPEG ファイルになります。 この変換は輝度成分データのみを見ればロスレスなので、 これは画像をグレイスケール形式に変換する良い方法です(展開→変換→再圧縮 をすると画質劣化が起こる)。このスイッチは、間違ってフルカラー JPEG 形式で圧縮されてしまったモノクロ画像を本来のグレイスケール JPEG 形式に直す場合に特に便利です。(そのような場合、ファイルをグレイスケール JPEG に変換してもそのファイルサイズの差はわずかですが、 画像の展開速度ではフルカラー JPEG よりも グレイスケール JPEG の方がかなり速くなります。)

jpegtran には他にも、コメントブロックのような「エクストラ・マーカー」 (訳注:JPEG ファイル中に埋め込まれている、画像データには直接関係しない各種データ。 これには Exif の撮影情報やサムネイルなども含まれます。) を出力ファイルへコピーするかどうかを変更するスイッチがあります。

-copy none 入力ファイル中のエクストラマーカーをコピーしません。 この設定は、入力ファイルの中に存在するコメントや各種データなどをすべて捨てます。
-copy comments コメントマーカー(COM ブロック)のみをコピーします。この設定は、 入力ファイル中のコメントのみをコピーし、 その他の必ずしも必要でないようなデータは捨てます。
-copy all すべてのエクストラマーカーをコピーします。この設定は、入力ファイル中に存在する JFIF サムネイルや Photoshop の設定などの各種マーカー(データ)をすべて保存します。 ファイルによっては、これらのエクストラマーカーはかなりのサイズを占めます。

この -copy スイッチを特に指定しないときの動作は -copy comments と同じです。(注:この IJG ソフトウェアの旧バージョンである v6 と v6a では、 jpegtran は 常に -copy none と同じ動作をしていました。)

jpegtran が認識するそのほかのスイッチには以下のようなものがあります。

-outfile filename
-maxmemory N
-verbose
-debug

これらのスイッチは cjpeg/djpeg のものと同じ動作をします。

コメント・ユーティリィティー

JPEG 規格においては、コメント・ブロック (COM ブロック) を JPEG ファイルに埋め込むことを許しています。 この COM ブロックが何のためのものかを規格では実際には定めていませんが、 ユーザー提供のテキスト文字列を格納する目的で広く使われています。これを用いると、 注釈やタイトル・見出し語などを JPEG ファイルに付加でき、 あとでそれらを参照することができます。この COM ブロックは、 JPEG ファイルに格納された画像そのものにはまったく影響を与えません。 一つの COM ブロックの最大サイズは 64K バイトですが、 一つの JPEG ファイルには好きな数だけ COM ブロックを埋め込むことができます。

この Independent JPEG Group's JPEG software には、 COM ブロックの内容を表示するプログラムと、 COM ブロックを JPEG ファイルに付加するプログラムが付属しています。

rdjpgcom は JPEG ファイルの中を調べ、 ファイル中に存在している COM ブロックの内容を標準出力に出力します。 コマンドラインの形式は、

rdjpgcom [-verbose] [入力(対象)ファイル名]

-verbose (または短縮して -v) スイッチを指定すると、 圧縮されている画像のサイズなども表示します。 コマンドラインから入力(対象)ファイル名を省略した場合は、 標準入力から JPEG ファイルを読み込みます。 (これは、標準入力からバイナリデータを読めない OS では、 正常に動作しないこともあります。)

wrjpgcom は、 ユーザが提供したテキストを内容とする COM ブロックを JPEG ファイルに付加します。 普通は、すでに JPEG ファイル中にある COM ブロックの後に新しい COM ブロックが挿入されますが、古い COM ブロックを削除することもできます。 wrjpgcom は新しい JPEG ファイルを作成します。つまり、入力ファイルを変更せず、 新しい別のファイルに結果を出力します。ファイルを直接変更しようとして、 入力ファイルと出力ファイルに同じ名前を指定しないでください。 ほとんどのシステムでは、単にファイルが破壊されてしまうだけになります。

wrjpgcom のコマンドラインの形式は、

wrjpgcom [スイッチ] 入力ファイル名 出力ファイル名

入力ファイル名出力ファイル名 は両方とも明示的に指定する必要があります。

wrjpgcom は以下の3つのスイッチを理解します。

-replace 既存の COM ブロックをファイルから削除します。
-comment "Comment text" コマンドラインから COM テキストを供給します。
-cfile name 指定したファイルからテキストを読み込みます。

(スイッチの名前は短縮できます) 付加するコメントテキストが1行のみの場合は、 コマンドラインから -comment オプションでテキストそのものを指定できます。 この場合、コメントテキストは必ず二重引用符 "" で囲む必要があります。 長いコメントはテキストファイルから読み込めます。

もし -comment-cfile も指定されていない場合は、 wrjpgcom は標準入力からコメントテキストを読み込みます。 標準入力をリダイレクトしていない場合は、キーボードからテキストを入力してください。 64KB までなら、複数行を入力できます。テキストを入力し終えたら、 コメントテキスト入力を終了させるために EOF (control-Z) をタイプしてください。

もし、対象のコメントテキストが空文字列の場合、 wrjpgcom は COM ブロックを付加しません。 なので、-replace -comment "" と指定することで、 JPEG ファイル中のすべての COM ブロックを削除することができます。


※※この日本語訳について※※

この日本語訳は、 宮坂 賢 <alkaid@coral.ocn.ne.jp> が個人的に訳したものです。 訳者は専門の翻訳業をやっているわけではありませんので、 翻訳の正確さなどについてはまったく保証いたしません。正確な情報が必要な場合は、 英語の原文を参照してください。

この日本語訳文章は、原文に正確なことよりも、 日本語として自然な文章になるように訳しました。 単なる原文の訳では理解しづらいと思われる部分には、原文には存在しない文章を (訳注:)のマークを付けずに独断で付け足した部分もあります。 誤訳など翻訳内容に関する指摘は歓迎いたしますが、 高校の英語の試験のような重箱の隅を突くような指摘は、 できればご遠慮いただければ幸いです(^^;。

この文書は、IJG の 公式 MS-DOS 版 バイナリ配布アーカイブ である ftp://ftp.simtel.net/.2/simtelnet/msdos/graphics/jpeg6_b.zip に収められて いる usage.doc を訳したものです。ソース配布アーカイブ である ftp://ftp.simtel.net/.2/simtelnet/msdos/graphics/jpegsr6.zip に収められて いる usage.doc とは文面が一部異なります。ご注意ください。

この日本語訳の著作権は 宮坂 賢 <alkaid@coral.ocn.ne.jp> が保持しますが、 この文書の転載・再配布・文書フォーマット変換などは自由とします。


戻る