3

我无法在我的 java 项目中获取 libjpeg-turbo 来实际压缩图像。它可以很好地写入 .jpg - 但结果的最终大小总是例如与相同图像的 24 位 windows .bmp 几乎相同。一个 480x854 的图像会变成一个 1.2 兆字节的 jpeg,代码片段如下。如果我使用灰色采样,它的大小是 800Kb(而且这些图像一开始并不是花哨的图像——主要是中性背景,上面有一些填充的原色光盘,用于我正在开发的游戏)。

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

// 对于一些 RGB888 格式的 byte[] src,代表一个维度的图像
//“宽度”和“高度”
尝试
{
    TJCompressor tjc = 新的 TJCompressor(
            源代码,
            宽度
            0, // "pitch" - 扫描线大小
            高度
            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 分钟内,答案就打动了我。

结果的十六进制转储显示这些图像的文件末尾只是很多很多的 0。

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

最终结果变为:

// 对于一些 RGB 格式的 byte[] src,表示一个维度的图像
//“宽度”和“高度”
尝试
{
    TJCompressor tjc = 新的 TJCompressor(
            源代码,
            宽度
            0, // "pitch" - 扫描线大小
            高度
            TJ.PF_RGB // 格式
    );
    tjc.setJPEGQuality(75);
    tjc.setSubsamp(TJ.SAMP_420);
    字节[] jpg_data = tjc.compress(0);
    int actual_size = tjc.getCompressedSize();
    新 java.io.FileOutputStream(新 java.io.File("/tmp/dump.jpg"))。
            写(jpg_data,0,实际大小);
}
捕获(异常 e)
{
    e.printStackTrace(System.err);
}
于 2013-05-22T23:39:14.537 回答