我正在尝试用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中实现的吗?
任何指导和/或资源,你可以给我非常感谢!
大概tinyjpg都有自己的压缩算法。我怀疑你会在标准库中找到它。可能看Chroma subsampling e.d. – mpkorstanje
当然他们有自己的算法。我的问题是真的,你有什么想法(程序)可以做什么?什么类型的数据可以安全地丢弃?你如何找出哪些数据可以丢弃为一个特定的JPEG? –
*“像www.tinyjpg.com这样的网站声称(并且确实)将jpeg图像的文件大小减少了40%-60%,**没有质量损失**。”*我非常怀疑它。你可能没有看到质量损失,这很好,但要宣称它不是只有......好吧,让我们一起去看*在一般情况下极不可能*。 –