2016-01-15 19 views
2

我正在尝试用Java编写图像优化软件。第一步也是最明显的一步是剥离EXIF元数据,这是我成功完成的。我也尝试使用ImageIO和压缩质量参数压缩图像,如下所示:在Java中可以进行极端图像优化吗?

filepath=chosen.getCanonicalPath()+"-temp.jpg"; 
file=new File(filepath); 
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg"); 
if (!writers.hasNext()){ 
    throw new IllegalStateException("No writers found"); 
} 
OutputStream os = new FileOutputStream(file); 
ImageWriter writer = (ImageWriter) writers.next(); 
ImageOutputStream ios = ImageIO.createImageOutputStream(os); 
writer.setOutput(ios); 

ImageWriteParam param = writer.getDefaultWriteParam(); 
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
param.setCompressionQuality(0.9f); 
writer.write(null, new IIOImage(optimized, null, null), param); 

但是,这确实无法正常工作。当源图像是不同格式(即不是jpeg)时,它可以正常工作,但是当从jpeg压缩到jpeg时,它有时甚至会使文件大小变大大于

网站类似www.tinyjpg.com权利要求(并且这样做)由40%-60%没有质量损失减少JPEG图像的文件大小。他们究竟怎么做(程序上和编程上)?他们删除了哪些类型的数据,以及如何在没有质量损失的情况下删除这些数据?这是我可能在Java中实现的吗?

任何指导和/或资源,你可以给我非常感谢!

+0

大概tinyjpg都有自己的压缩算法。我怀疑你会在标准库中找到它。可能看Chroma subsampling e.d. – mpkorstanje

+0

当然他们有自己的算法。我的问题是真的,你有什么想法(程序)可以做什么?什么类型的数据可以安全地丢弃?你如何找出哪些数据可以丢弃为一个特定的JPEG? –

+0

*“像www.tinyjpg.com这样的网站声称(并且确实)将jpeg图像的文件大小减少了40%-60%,**没有质量损失**。”*我非常怀疑它。你可能没有看到质量损失,这很好,但要宣称它不是只有......好吧,让我们一起去看*在一般情况下极不可能*。 –

回答

1

Wikipedia - JPG - Lossless further compression我猜想,微小的JPG已使用创造最标准的工具后所开发的改进算法。改进的算法在PackJPG中实现,其方便地开源。似乎没有Java实现。

作为一个方面说明:PackJPG声称提高20%,而Tiny JPG声称提高70%。这可能是夸大其词,但你可能想要测试这两个索赔。

+0

PackJPG是什么语言?可以将它与Java程序结合使用吗? –

+0

这是一个命令行应用程序,用C++编写的。您可以从java调用命令行应用程序。 http://stackoverflow.com/questions/9346077/java-execute-command-line-program – mpkorstanje

+0

有没有一种方法可以让我的程序检查PackJPG是否安装在本地机器上,如果没有,然后安装它? –

2

在JPEG有三个步骤是优化的:

  1. 组件的相对采样。以低于Y分量的速率对Cb或Cr分量进行采样。您可以平滑Cb和Cr值,使1,2,4,8或16像素共享相同的Cb或Cr值(正式情况下,JPEG也支持分数采样率,但大多数解码器不支持它们)。如果使用4:1:1的采样率,则会将数据量减半。

  2. (大之一,最难做的)选择优化的量化表。

  3. 生成最佳Huffman表(容易做,但许多编码器不)。