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

如何让libjpeg-turbo的java包装器进行实际压缩?,java,libjpeg-turbo,turbojpeg,Java,Libjpeg Turbo,Turbojpeg,在java项目中,我很难让libjpeg-turbo真正压缩图像。它的.jpg格式写得很好,但结果的最终大小始终与相同图像的24位windows.bmp格式几乎相同。480x854图像将转换为1.2兆字节的jpeg,并带有以下代码段。如果我使用灰度采样,它的大小是800Kb(而且这些图像一开始就不是很好看——大部分是中性背景,上面有一些填充的原色光盘,我正在制作一个游戏) 以下是我目前掌握的代码: // for some byte[] src in RGB888 format, represen

在java项目中,我很难让libjpeg-turbo真正压缩图像。它的.jpg格式写得很好,但结果的最终大小始终与相同图像的24位windows.bmp格式几乎相同。480x854图像将转换为1.2兆字节的jpeg,并带有以下代码段。如果我使用灰度采样,它的大小是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); } //对于RGB888格式的某些字节[]src,表示维度的图像 //“宽度”和“高度” 尝试 { tjc压缩机tjc=新的tjc压缩机( 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标准的内部结构,也不想:)


谢谢

Doh!在发布问题的5分钟内,我就想到了答案

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

对于将来遇到类似情况的任何人,不要使用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); } //对于RGB格式的某些字节[]src,表示维度的图像 //“宽度”和“高度” 尝试 { tjc压缩机tjc=新的tjc压缩机( src, 宽度 0,/“螺距”-扫描线尺寸 高度 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_数据,0,实际_大小); } 捕获(例外e) { e、 printStackTrace(System.err); }
从源
位图
执行相同操作(而不是对其调用slow
.compress()
方法)怎么样?有什么建议吗?有时候API设计得很愚蠢,我花了很多时间,不知道为什么输出文件比输入文件大。我对输出长度太大没有什么好的理由,谢谢,你节省了我的时间:)