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

Posted

技术标签:

【中文标题】如何让 libjpeg-turbo 的 java 包装器实际压缩?【英文标题】:How to get java wrapper for libjpeg-turbo to actually compress? 【发布时间】:2013-05-22 23:29:53 【问题描述】:

我无法在我的 java 项目中获取 libjpeg-turbo 以实际压缩图像。它可以很好地写入 .jpg - 但结果的最终大小始终是例如几乎与相同图像的 24 位 windows .bmp 相同。一张 480x854 的图像会变成一个 1.2 兆字节的 jpeg,代码如下 sn-p。如果我使用 GREY 采样,它是 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 标准的内部结构,我也不想:)!

谢谢!

【问题讨论】:

【参考方案1】:

哇!在发布问题后的 5 分钟内,我得到了答案。

结果的 hexdump 显示这些图像的文件末尾只是很多很多 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);

【讨论】:

从源 Bitmap 做同样的事情怎么样(而不是调用慢的 .compress() 方法)?有什么建议吗? 有时候API设计的很傻,花了很多时间,不知道为什么输出文件比输入文件大。我没有任何充分的理由对巨大的输出长度,谢谢,你节省了我的时间:)

以上是关于如何让 libjpeg-turbo 的 java 包装器实际压缩?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 libjpeg-turbo 解码 JPEG9 图像?

如何将 libjpeg-turbo Android NDK 添加为静态库

Go初接触之libjpeg-turbo

windows 10上源码编译libjpeg-turbo和使用教程 | compile and use libjpeg-turbo on windows 10

markdown 的libjpeg-turbo.repo

libJPEG-turbo库使用示例代码