在 Java 中更改图像分辨率而不调整大小

问题描述 投票:0回答:3

我想压缩

jpeg
图像,即降低其分辨率,而不以任何方式调整其大小。有没有好的 Java 库可以帮助我做到这一点? SO 中有很多类似的帖子,但大多数最终也会调整图像大小。

如果没有,我该如何以编程方式做到这一点?假设参数为 0.9,图像的分辨率将降低 0.1 倍...

java jpeg image-compression
3个回答
6
投票

通常“分辨率”是指尺寸。您指的是 JPEG 质量吗?这是我能想到的唯一方法来压缩它而不调整它的大小。

如果是这样,您可以使用Java2D ImageIO API。像下面这样的东西就可以了(改编自此页面):

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
投票

您可以使用

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。


0
投票

该解决方案会降低质量但会旋转图像。如何防止图像旋转?

© www.soinside.com 2019 - 2024. All rights reserved.