3

Java プロジェクトで実際に画像を圧縮するために libjpeg-turbo を取得するのに問題があります。これは .jpg をうまく書き込みますが、結果の最終的なサイズは常に、たとえば同じ画像の 24 ビット ウィンドウの .bmp とほぼ同じになります。480x854 の画像は、以下のコード スニペットを使用して 1.2 メガバイトの jpeg に変換されます。GRAY サンプリングを使用すると、800Kb になります (そして、これらはそもそも派手な画像ではありません。ほとんどの場合、私が取り組んでいるゲームの原色ディスクが塗りつぶされたニュートラルな背景です)。

これまでに得たコードは次のとおりです。

// RGB888 形式の byte[] src に対して、寸法の画像を表す
// 「幅」と「高さ」
試す
{
    TJCompressor tjc = new TJCompressor(
            src、
            幅
            0, // "ピッチ" - スキャンラインのサイズ
            身長
            TJ.PF_RGB // フォーマット
    );
    tjc.setJPEGQuality(75);
    tjc.setSubsamp(TJ.SAMP_420);
    バイト[] jpg_data = tjc.compress(0);
    new java.io.FileOutputStream(new java.io.File("/tmp/dump.jpg")).write(jpg_data, 0, jpg_data.length);
}
キャッチ(例外e)
{
    e.printStackTrace(System.err);
}

私は特に、このプロジェクトのサンプル Java 使用ドキュメントを見つけるのに苦労しています。ほとんどの場合、C のバックグラウンド/使用法を前提としています。私は圧縮に渡すフラグを理解していません (また、jpeg 標準の内部構造を本当に知っているわけでもなく、知りたいわけでもありません :)!

ありがとう!

4

1 に答える 1

2

どっ!そして、質問を投稿してから 5 分以内に答えがヒットしました。

結果の 16 進ダンプは、これらのイメージのファイルの末尾が非常に多くの 0 であることを示していました。

将来、同様の状況に陥った人のために、jpg_data.length (何らかの理由で完全に大きすぎるようです) を使用する代わりに、TJCompressor.compress() への呼び出しの直後に TJCompressor.getCompressedSize() を使用してください。

最終結果は次のようになります。

// 寸法のイメージを表す RGB 形式の byte[] src の場合
// 「幅」と「高さ」
試す
{
    TJCompressor tjc = new TJCompressor(
            src、
            幅
            0, // "ピッチ" - スキャンラインのサイズ
            身長
            TJ.PF_RGB // フォーマット
    );
    tjc.setJPEGQuality(75);
    tjc.setSubsamp(TJ.SAMP_420);
    バイト[] jpg_data = tjc.compress(0);
    int actual_size = tjc.getCompressedSize();
    new java.io.FileOutputStream(new java.io.File("/tmp/dump.jpg"))。
            書き込み (jpg_data、0、実際のサイズ);
}
キャッチ(例外e)
{
    e.printStackTrace(System.err);
}
于 2013-05-22T23:39:14.537 に答える