オペレーター Library: Compression
このオペレーターは、8ビットグレースケール画像のJPEG圧縮を実行します。
![]() |
8x8ピクセルのブロック単位の入力データが必要です |
|---|---|
|
入力において、オペレーターは8x8ピクセルのブロックに再マッピングされた画像データを受け取る必要があります。 microEnable IVフレームグラバーを使用している場合、この再マッピングにオペレーター ImageBuffer_JPEG_Gray を使用できます。 microEnable IVのデザインの場合は、オペレーター JPEG_Encoder_Gray の手前にオペレーター ImageBuffer_JPEG_Gray を配置するだけです。 オペレーター ImageBuffer_JPEG_Gray は、この並べ替えを実行するように設計されています。 microEnable 5フレームグラバーを使用している場合は、オペレーター JPEG_Encoder_Gray を使用する前に、(一般的なVisualAppletsのオプションを使用して)画像データを8x8ピクセルのブロックに必ず再マッピングしてください。 |
オペレーターの出力は、JPEGヘッダーを持たないハフマンストリームです。 圧縮率は、実行時に変更可能な、選択された量子化テーブルによって異なります。 ハフマン符号化には標準輝度テーブルが使用されます。 量子化テーブルのほか、圧縮率、つまり出力ストリームのサイズは入力画像によって異なります。 したがって、オペレーターの出力幅は、希望する出力サイズに変更可能です。
JPEGエンコーダーは、クロックサイクルあたり約2.5入力ピクセルを処理できます。 クロック周波数は使用するフレームグラバーによって異なります。microEnable IVフレームグラバーのベースクロック周波数は62.5MHzです。 したがって、オペレーターはmicroEnable IVフレームグラバー上で158MPixels/sを処理できます。 高品質な圧縮を引き起こす量子化テーブルを使用した場合、データレートを削減できます。 これは、Qualityレベルが約95%を超える場合に発生します。 詳細については、JPEGアプリケーションノートを参照してください。
このオペレーターでは、2つの設定方法を表す2つのパラメータを使用して量子化テーブルを選択できます。
-
必要に応じて、量子化テーブルの各値を個別に設定できます。 この場合は、パラメータ quantization_matrix を使用してください。
-
あるいは、パーセンテージ値から量子化テーブルを決定することもできます。 この場合は、パラメータ quality_in_percent を使用してください。
標準輝度量子化テーブルを以下に示します。これは、オペレーターのデフォルト設定として使用されます。
パーセンテージによるQualityを使用する場合、量子化テーブルは次の式によって計算されます
説明したように、オペレーターの出力はエンコードされた画像データのハフマンストリームです。 基礎となるDC係数およびAC係数は固定されており、文献(W. P. Pennbaker and J. L. Mitchell, JPEG Still Image Data Compression Standard, Van Nostrand Rheinhold, 1993)から取得されています。 リストについては以降を参照してください。 エンコーダーによって生成されたハフマンストリームには、JPEG画像ファイルを生成するために必要なJPEGヘッダーが含まれていません。 さらに、生成されたデータストリームは32-bitの幅を持っています。 JPEGデータストリームの最後 ワード、つまり最後の4バイトには、次の形式のステータス情報が含まれています。
-
最後のワードの0バイト目と1バイト目は、0xffおよび0xd9であるJPEG EOIマーカーを表します。
-
2番目のバイトは、最後から2番目のデータワードで使用されているバイト数(範囲 [1, 4])、つまりJPEGデータストリームの実際の終了位置を表します。
-
最後の3番目のバイトはエラーコードを表します。 JPEGデータストリームが、出力リンクに指定された最大画像幅よりも大きい場合、出力は切り捨てられます。 これが発生した場合、最後のバイトは1に設定され、この切り捨ての検出が可能になります。
JPEG出力データストリームの終了部分の例を以下に示します。
最後から2番目のワード: 0xffff5fed
最後のワード: 0x0002d9ff
したがって、JPEG出力データストリームは、最後から2番目のワードの2番目のバイトで終了します。 データストリームは切り捨てられていません。
Operator Restrictions
-
このオペレーターは空の画像、つまりピクセルを持たない画像をサポートしていません。
-
ポートIにおける各入力画像のラインは同じ長さでなければなりません。したがって、ラインの長さが異なる画像は許可されません。
| quality_in_percent | |
|---|---|
| タイプ | 動的読み取り/書き込みパラメータ |
| Default | 50 |
| 範囲 | [-1, 100] |
|
このパラメータを使用して、JPEG圧縮のQualityを変更できます。 量子化マトリクスは、上記の式を使用してパーセンテージ値から決定されます。 決定された量子化値は、パラメータ quantization_matrix から読み取ることができます。 このパラメータは動的であり、アプレットのアイドル時間にのみ変更する必要があります。 0から100の間のQuality設定を定義できます。 このパラメータに書き込むと、パラメータ quantization_matrix によって行われた量子化マトリクスの手動変更が上書きされます。 quality_in_percent から -1 が読み取られた場合、量子化マトリクスの手動変更が行われています。 |
|
| quantization_matrix | |
|---|---|
| タイプ | static/dynamic read/write parameter |
| Default | 標準マトリクス(上記を参照) |
| 範囲 | [1, 255] |
|
このパラメータは、動的な読み取り/書き込みマトリクスパラメータです。 JPEGのQualityがパーセンテージ値で設定されている場合。 このパラメータを使用して、決定された量子化マトリクスの値を読み取ることができます。 このパラメータは、ユーザー定義の量子化マトリクスを指定するためにも使用できます。 これを行うには、いずれかの量子化マトリクス値に書き込みます。 パラメータ quality_in_percent への書き込みは、ユーザーが指定した量子化値を破棄することに注意してください。 便宜上、ユーザーが指定した値が書き込まれた後、パラメータ quality_in_percent は -1 に設定されます。 |
|
JPEG_Encoder_Gray オペレータの使用方法は、次の例に示されています。
-
例 - microEnable 4および5プラットフォーム向けで非推奨となった JPEG_Encoder_Gray オペレーターの使用方法を示すシンプルな例です。
-
'複数の JPEG_Encoder_Gray オペレータを並列で使用する'
例 - 複数の JPEG_Encoder_Gray オペレータを並列で使用する
次のハフマン DC および AC 係数が使用されます。
typedef char DCHuffTableType[12][17]; // huffman-table for luminance-DC-coefficients
DCHuffTableType Lum_DC_HuffmanTable= {
"00",
"010",
"011",
"100",
"101",
"110",
"1110",
"11110",
"111110",
"1111110",
"11111110",
"111111110" };
typedef char ACHuffTableType[16][11][17]; // Huffman-Tabelle für Luminance-AC-Koeffizienten
ACHuffTableType Lum_AC_HuffmanTable= {
{ //Run == 0
"1010",//EOB
"00",
"01",
"100",
"1011",
"11010",
"1111000",
"11111000",
"1111110110",
"1111111110000010",
"1111111110000011"
},
{ //Run == 1
"1010",//EOB
"1100",
"11011",
"1111001",
"111110110",
"11111110110",
"1111111110000100",
"1111111110000101",
"1111111110000110",
"1111111110000111",
"1111111110001000"
},
{ //Run == 2
"1010",//EOB
"11100",
"11111001",
"1111110111",
"111111110100",
"1111111110001001",
"1111111110001010",
"1111111110001011",
"1111111110001100",
"1111111110001101",
"1111111110001110"
},
{ //Run == 3
"1010",//EOB
"111010",
"111110111",
"111111110101",
"1111111110001111",
"1111111110010000",
"1111111110010001",
"1111111110010010",
"1111111110010011",
"1111111110010100",
"1111111110010101"
},
{ //Run == 4
"1010",//EOB
"111011",
"1111111000",
"1111111110010110",
"1111111110010111",
"1111111110011000",
"1111111110011001",
"1111111110011010",
"1111111110011011",
"1111111110011100",
"1111111110011101",
},
{ //Run == 5
"1010",//EOB
"1111010",
"11111110111",
"1111111110011110",
"1111111110011111",
"1111111110100000",
"1111111110100001",
"1111111110100010",
"1111111110100011",
"1111111110100100",
"1111111110100101"
},
{ //Run == 6
"1010",//EOB
"1111011",
"111111110110",
"1111111110100110",
"1111111110100111",
"1111111110101000",
"1111111110101001",
"1111111110101010",
"1111111110101011",
"1111111110101100",
"1111111110101101"
},
{ //Run == 7
"1010",//EOB
"11111010",
"111111110111",
"1111111110101110",
"1111111110101111",
"1111111110110000",
"1111111110110001",
"1111111110110010",
"1111111110110011",
"1111111110110100",
"1111111110110101",
},
{ //Run == 8
"1010",//EOB
"111111000",
"111111111000000",
"1111111110110110",
"1111111110110111",
"1111111110111000",
"1111111110111001",
"1111111110111010",
"1111111110111011",
"1111111110111100",
"1111111110111101"
},
{ //Run == 9
"1010",//EOB
"111111001",
"1111111110111110",
"1111111110111111",
"1111111111000000",
"1111111111000001",
"1111111111000010",
"1111111111000011",
"1111111111000100",
"1111111111000101",
"1111111111000110"
},
{ //Run == 0xA
"1010",//EOB
"111111010",
"1111111111000111",
"1111111111001000",
"1111111111001001",
"1111111111001010",
"1111111111001011",
"1111111111001100",
"1111111111001101",
"1111111111001110",
"1111111111001111"
},
{ //Run == 0xB
"1010",//EOB
"1111111001",
"1111111111010000",
"1111111111010001",
"1111111111010010",
"1111111111010011",
"1111111111010100",
"1111111111010101",
"1111111111010110",
"1111111111010111",
"1111111111011000"
},
{ //Run == 0xC
"1010",//EOB
"1111111010",
"1111111111011001",
"1111111111011010",
"1111111111011011",
"1111111111011100",
"1111111111011101",
"1111111111011110",
"1111111111011111",
"1111111111100000",
"1111111111100001"
},
{ //Run == 0xD
"1010",//EOB
"11111111000",
"1111111111100010",
"1111111111100011",
"1111111111100100",
"1111111111100101",
"1111111111100110",
"1111111111100111",
"1111111111101000",
"1111111111101001",
"1111111111101010"
},
{ //Run == 0xE
"1010",//EOB
"1111111111101011",
"1111111111101100",
"1111111111101101",
"1111111111101110",
"1111111111101111",
"1111111111110000",
"1111111111110001",
"1111111111110010",
"1111111111110011",
"1111111111110100"
},
{ //Run == 0xF
"11111111001", //ZRL
"1111111111110101",
"1111111111110110",
"1111111111110111",
"1111111111111000",
"1111111111111001",
"1111111111111010",
"1111111111111011",
"1111111111111100",
"1111111111111101",
"1111111111111110"
}
};

![[重要]](../common/images/admon/important.png)


前へ

