Operator Library: Compression
オペレーターは、8ビットのグレースケール画像に対してJPEG圧縮を実行します。
![]() |
入力データは8x8ピクセルのブロック単位で必要です |
|---|---|
|
入力として、オペレータは8×8ピクセルのブロックに再マッピングされた画像データを受け取る必要がある。 microEnable IVフレームグラバーを使用する場合は、オペレーターImageBuffer_JPEG_Grayを使用してこのリマッピングを行うことができます。microEnable IV設計の場合は、オペレーターJPEG_Encoder_Grayの前にオペレーターImageBuffer_JPEG_Grayを追加するだけで済みます。オペレーターImageBuffer_JPEG_Grayは、この順序変更を実行するように設計されています。 microEnable 5 フレームグラバーを使用する場合は、オペレーターJPEG_Encoder_Grayを使用する前に、画像データを 8x8 ピクセルのブロックに再マッピングしてください (一般的な VisualApplet オプションを使用)。 |
オペレータの出力は、JPEGヘッダーのないハフマンストリームです。圧縮率は、実行時に変更可能な選択された量子化テーブルによって決まります。ハフマン符号化には、標準の輝度テーブルが使用されます。量子化テーブルに加えて、圧縮率、つまり出力ストリームのサイズは入力画像にも依存します。したがって、オペレータの出力幅は、目的の出力サイズに変更できます。
JPEGエンコーダは、クロックサイクルあたり約2.5個の入力ピクセルを処理できます。クロック周波数は、使用するフレームグラバーによって異なります。microEnable IVフレームグラバーの基本クロック周波数は62.5MHzです。したがって、オペレーターはmicroEnable IVフレームグラバーで158Mピクセル/秒を処理できます。高品質の圧縮を実現する量子化テーブルを使用すると、データレートを下げることができます。これは、品質レベルが約95%以上の場合に当てはまります。詳細については、JPEGアプリケーションノートを参照してください。
このオペレータは、2つの異なる構成方法を表す2つのパラメータを使用して、量子化テーブルを選択することを可能にする。
-
必要に応じて、量子化テーブルの各値を個別に設定できます。その場合は、パラメータquantization_matrixを使用してください。
-
あるいは、量子化テーブルはパーセンテージ値から決定することもできます。この場合は、パラメータquality_in_percent を使用してください。
標準輝度量子化テーブルを以下に示します。これは、オペレータのデフォルト設定として使用されます。
パーセンテージ品質を使用する場合、量子化テーブルは次の式で計算されます。
前述のとおり、オペレータの出力はエンコードされた画像データのハフマンストリームです。 DC 係数と AC 係数は固定されており、文献、具体的には WP Pennbaker と JL Mitchell の JPEG Still Image Data Compression Standard、Van Nostrand Rheinhold、1993 年から取得されています。リストについては後述します。エンコーダによって生成されたハフマン ストリームには、JPEG 画像ファイルを生成するために必要な JPEG ヘッダーが含まれていません。さらに、生成されたデータ ストリームの幅は 32Bbit です。最後のワード、つまり JPEG データ ストリームの最後の 4 バイトは、次の形式のステータス情報を提供します。
-
最後のワードの0バイト目と1バイト目は、JPEG EOIマーカーを表し、それぞれ0xffと0xd9です。
-
2番目のバイトは、[1, 4]の範囲内の最後から2番目のデータワードで使用されるバイト数を表します。つまり、JPEGデータストリームの真の終端です。
-
最後の3バイト目はエラーコードを表します。JPEGデータストリームが出力リンクで指定された最大画像幅を超えると、出力は切り詰められます。この場合、最後のバイトは1に設定され、切り詰めを検出できるようになります。
JPEG出力データストリームの終端の例を以下に示します。
最後から2番目の単語: 0xffff5fed
最後の単語: 0x0002d9ff
したがって、JPEG出力データストリームは、最後から2番目の単語の2バイト目で終了します。データストリームは切り詰められません。
Operator Restrictions
-
このオペレーターは、空の画像(ピクセルのない画像)をサポートしていません。
-
ポート I における各入力画像のラインは、同じ長さである必要があります。したがって、ライン長が異なる画像は許可されません。
| 品質(パーセント) | |
|---|---|
| タイプ | 動的読み取り/書き込みパラメータ |
| Default | 50 |
| 範囲 | [-1, 100] |
|
このパラメータを使用すると、JPEG圧縮の品質を変更できます。量子化行列は、上記の式を使用してパーセンテージ値から決定されます。決定された量子化値は、パラメータquantization_matrixから読み取ることができます。このパラメータは動的であるため、アプレットがアイドル状態のときにのみ変更してください。 Quality 0~100の範囲で設定値を定義できます。このパラメータに書き込むと、パラメータquantization_matrixによって行われた量子化行列の手動変更が上書きされます。quality_in_percentから-1が読み取られた場合、量子化行列が手動で変更されたことを意味します。 |
|
| quantization_matrix | |
|---|---|
| タイプ | static/dynamic read/write parameter |
| Default | 標準マトリクス(上記を参照) |
| 範囲 | [1, 255] |
|
このパラメータは、動的な読み取りおよび書き込みが可能なマトリクスパラメータです。JPEG Qualityがパーセンテージ値で設定されている場合、このパラメータを使用して、決定された量子化マトリクス値を読み取ることができます。 このパラメータは、ユーザー定義の量子化マトリクスの指定にも使用できます。これは、いずれかの量子化マトリクス値に書き込むことで実行できます。qulity_in_percentパラメータに書き込むと、ユーザーが指定した量子化値は破棄されることに注意してください。便宜上、ユーザー指定の値が書き込まれた後、パラメータ quality_in_percent は -1 に設定されます。 |
|
JPEG_Encoder_Gray オペレーターの使用方法を次の例に示します:
-
Examples - microEnable 4および5プラットフォーム向けの非推奨の JPEG_Encoder_Gray オペレーターの使用方法を示す簡単な例。
-
'複数の JPEG_Encoder_Gray オペレーターを並列で使用する'
例 - 複数の JPEG_Encoder_Gray オペレーターを並列で使用する
次の Huffman 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)


前へ

