在java项目中,我很难让libjpeg-turbo真正压缩图像。它可以写一个.jpg文件,但最终的结果大小总是一样的,比如说,几乎和同一图像的24位windows.bmp文件一样。一个480x854的图像变成一个1.2兆字节的jpeg文件,代码如下。如果我使用灰色采样,它是800kb(而且这些图像一开始不是很漂亮——大部分是中性背景,上面有一些填充的主色光盘,我正在开发的游戏)。
这是我目前掌握的代码:
//rgb888格式的某个字节的[]src,表示维度的图像
//“宽度”和“高度”
尝试
{
TJCompressor TJC=新TJCompressor(
SRC公司,
宽度
0,//“间距”-扫描线尺寸
高度
tj.pf_rgb//格式
)(二)
tjc.setjpegquality(75);
TJC.设置子放大器(TJ.samp_420);
字节[]jpg_data=tjc.compress(0);
新的java.io.fileOutputStream(新的java.io.file(“/tmp/dump.jpg”)).write(jpg_data,0,jpg_data.length);
}
catch(异常e)
{
e.printstacktrace(系统错误);
}
我特别难以找到这个项目的Java使用文档示例;它主要假设C背景/使用。我不理解要传递给压缩的标志(也不知道jpeg标准的内部结构,也不想:)!
谢谢!
最佳答案
啊!在发布问题后的5分钟内,我得到了答案。
对结果的hexdump显示,这些图像的文件结尾只是很多很多0。
对于将来遇到类似情况的任何人,在调用TjCompressor.compress()之后立即使用TjCompressor.getCompressedSize()而不是使用jpg廑data.length_(这显然出于某种原因太大了)。
最终结果变成:
//对于某些rgb格式的byte[]src,表示维度的图像
//“宽度”和“高度”
尝试
{
TJCompressor TJC=新TJCompressor(
SRC公司,
宽度
0,//“间距”-扫描线尺寸
高度
tj.pf_rgb//格式
)(二)
tjc.setjpegquality(75);
TJC.设置子放大器(TJ.samp_420);
字节[]jpg_data=tjc.compress(0);
int实际大小=tjc.getCompressedSize();
新的java.io.FileOutputStream(新的java.io.file(“/tmp/dump.jpg”))。
写入(JPG U数据,0,实际U大小);
}
catch(异常e)
{
e.printstacktrace(系统错误);
}
关于java - 如何获取用于libjpeg-turbo的Java包装器进行实际压缩?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16703229/