我想压缩jpeg
图像,即降低其分辨率,而不以任何方式调整其大小。有没有好的Java库可以帮助我做到这一点? SO中有很多类似的帖子,但大多数帖子最终也会调整图像大小。
如果没有,我怎么能以编程方式进行呢?比方说,对于0.9的参数,图像的分辨率将减少0.1倍......
答案 0 :(得分:4)
通常“分辨率”表示大小。你的意思是JPEG质量吗?这是我可以想到的唯一方法来压缩它而不需要调整它。
如果是这样,您可以使用Java2D ImageIO API。类似下面的内容可以使用(改编自this page):
BufferedImage bufferedImage = ImageIO.read(...);
ImageWriter writer = (ImageWriter)ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(...);
File file = new File(...);
FileImageOutputStream output = new FileImageOutputStream(file);
writer.setOutput(output);
IIOImage image = new IIOImage(bufferedImage, null, null);
writer.write(null, image, iwp);
writer.dispose();
不幸的是,我认为没有办法获得图像的现有JPEG质量,因此您必须使用一些固定值来获得压缩质量。
答案 1 :(得分:1)
您可以使用Java2D
API执行此操作,并为输出图像设置压缩质量,这会降低图像质量和文件大小,但会保持与原始图像相同的宽度和高度
File imageFile = new File("original.jpg");
File compressedImageFile = new File("compressed.jpg");
InputStream is = new FileInputStream(imageFile);
OutputStream os = new FileOutputStream(compressedImageFile);
float quality = 0.7f; // Change this as needed
BufferedImage image = ImageIO.read(is);
// get all image writers for JPG format
Iterator<ImageWriter> writers = ImageIO
.getImageWritersByFormatName("jpg");
if (!writers.hasNext())
throw new IllegalStateException("No writers found");
ImageWriter writer = (ImageWriter) writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
// set compression quality
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
writer.write(null, new IIOImage(image, null, null), param);
// clean resources e.g. close streams
如果你想要更高级的东西,请检查imageJ
和[Fiji][2]
它们是非常强大的Java图像处理库,并且易于使用的API。