我在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标准的内部,我也不想:)!
谢谢!
答案 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); }