如何让libjpeg-turbo的java包装器实际压缩?

时间:2013-05-22 23:29:53

标签: java libjpeg-turbo turbojpeg

我在java项目中使用libjpeg-turbo来实际压缩图像时遇到了麻烦。它写的.jpg很好 - 但结果的最终大小总是如此几乎与同一图像的24位窗口.bmp相同。使用下面的代码片段,480x854图像变成1.2兆字节的jpeg。如果我使用GRAY采样它是800Kb(这些都不是花哨的图像开始 - 大多数是中性背景,其中有一些填充的原色盘用于我正在进行的游戏)。

这是我到目前为止的代码:

// for some byte[] src in RGB888 format, representing an image of dimensions
// 'width' and 'height'
try
{
    TJCompressor tjc = new TJCompressor(
            src,
            width
            0,  // "pitch" - scanline size
            height
            TJ.PF_RGB  // format
    );
    tjc.setJPEGQuality(75);
    tjc.setSubsamp(TJ.SAMP_420);
    byte[] jpg_data = tjc.compress(0);
    new java.io.FileOutputStream(new java.io.File("/tmp/dump.jpg")).write(jpg_data, 0, jpg_data.length);
}
catch(Exception e)
{
    e.printStackTrace(System.err);
}

我特别难以找到这个项目的示例java用法文档;它主要假设C背景/用法。我不明白要传递给压缩的标志(我也不知道jpeg标准的内部,我也不想:)!

谢谢!

1 个答案:

答案 0 :(得分:1)

卫生署!在发布问题的5分钟内,答案就出现了。

结果的hexdump显示这些图像的文件末尾只是很多很多的。

对于将来处于类似情况的任何人,不要使用jpg_data.length(由于某些原因显然太大),请在调用TJCompressor.compress()后立即使用TJCompressor.getCompressedSize()。

最终结果变为:

// for some byte[] src in RGB format, representing an image of dimensions
// 'width' and 'height'
try
{
    TJCompressor tjc = new TJCompressor(
            src,
            width
            0,  // "pitch" - scanline size
            height
            TJ.PF_RGB  // format
    );
    tjc.setJPEGQuality(75);
    tjc.setSubsamp(TJ.SAMP_420);
    byte[] jpg_data = tjc.compress(0);
    int actual_size = tjc.getCompressedSize();
    new java.io.FileOutputStream(new java.io.File("/tmp/dump.jpg")).
            write(jpg_data, 0, actual_size);
}
catch(Exception e)
{
    e.printStackTrace(System.err);
}