web-dev-qa-db-ja.com

Java)を使用してPNG画像を圧縮する方法

こんにちは私はJavaにBufferedImageとしてロードされて保存される画像のサイズを縮小する(あらゆる種類の圧縮を使用する)方法があるかどうか知りたいですPNG。

多分ある種のpngimagewriteparam?役に立ったものが見つからなかったので、行き詰まりました。

画像の読み込みと保存の方法のサンプルを次に示します

public static BufferedImage load(String imageUrl) {         
    Image image = new ImageIcon(imageUrl).getImage();
    bufferedImage = new BufferedImage(image.getWidth(null),
                                                    image.getHeight(null),
                                                    BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2D = bufferedImage.createGraphics();
    g2D.drawImage(image, 0, 0, null);
    return bufferedImage;
}

public static void storeImageAsPng(BufferedImage image, String imageUrl) throws IOException {
    ImageIO.write(image, "png", new File(imageUrl));
}
15
ubernoob

it's going to be saved as PNG、圧縮はその段階で行われます。 PNGには、調整可能なパラメーター( " filters "のタイプ)がほとんどなく、圧縮量への影響が少ないロスレス圧縮アルゴリズム(基本的に予測とそれに続くlempel-ziv圧縮)があります。通常、デフォルトが最適です。

3
leonbloy

pngtastic を試してみてください。これは純粋なJava png画像オプティマイザーであり、png画像をある程度縮小することができます。

2
depsypher

ImageIO.writeを呼び出すことにより、pngのデフォルトの圧縮品質を使用します。ファイルサイズを大幅に削減する明示的な圧縮モードを選択できます。

String inputPath = "a.png";
String outputPath = "b.png";

BufferedImage image;
IIOMetadata metadata;

try (ImageInputStream in = ImageIO.createImageInputStream(Files.newInputStream(Paths.get(inputPath)))) {
    ImageReader reader = ImageIO.getImageReadersByFormatName("png").next();
    reader.setInput(in, true, false);
    image = reader.read(0);
    metadata = reader.getImageMetadata(0);
    reader.dispose();
}

try (ImageOutputStream out = ImageIO.createImageOutputStream(Files.newOutputStream(Paths.get(outputPath)))) {
    ImageTypeSpecifier type = ImageTypeSpecifier.createFromRenderedImage(image);
    ImageWriter writer = ImageIO.getImageWriters(type, "png").next();

    ImageWriteParam param = writer.getDefaultWriteParam();
    if (param.canWriteCompressed()) {
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(0.0f);
    }

    writer.setOutput(out);
    writer.write(null, new IIOImage(image, null, metadata), param);
    writer.dispose();
}
0

ImageWriterParamクラスと同じパッケージのImageIOクラスを見てください。圧縮について言及しています。

https://docs.Oracle.com/javase/7/docs/api/javax/imageio/ImageWriteParam.html

http://exampledepot.com/egs/javax.imageio/JpegWrite.html の例も見て、PNGファイルに適切に変換されるかどうかを確認してください。

0
aioobe