web-dev-qa-db-ja.com

javaを使用して画像を圧縮するにはどうすればよいですか?

ページ速度から、画像リンクと、圧縮とサイズ変更などの可能性のあるバイトとパーセンテージの最適化のみを取得しています https://example.com/…ts/xyz.jpg?036861 は212KiB(51%削減)。圧縮 https://example.com/…xyz.png?303584508 は4.4KiBを節約できます(21%の削減)。

たとえば、サイズが300kbの画像があり、この画像の場合、pagespeedは100kbと30%の縮小を表示しています。

これは1つの画像のみですが、圧縮用の画像がたくさんあると確信しています。バイトまたはパーセンテージをパラメーターとして渡すか、Java(APIまたは画像処理ツールを使用))で他の計算を使用して画像を圧縮するにはどうすればいいですか?グーグルが提案した。

前もって感謝します。

8
Darshit Patel

Java ImageIO パッケージを使用して、多くの画像形式の圧縮を行うことができます。ここに例を示します。

import Java.awt.image.BufferedImage;
import Java.io.*;
import Java.util.Iterator;
import javax.imageio.*;
import javax.imageio.stream.*;

public class Compresssion {

  public static void main(String[] args) throws IOException {

    File input = new File("original_image.jpg");
    BufferedImage image = ImageIO.read(input);

    File compressedImageFile = new File("compressed_image.jpg");
    OutputStream os = new FileOutputStream(compressedImageFile);

    Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
    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.05f);  // Change the quality value you prefer
    writer.write(null, new IIOImage(image, null, null), param);

    os.close();
    ios.close();
    writer.dispose();
  }
}

それについての詳細を見つけることができます こちら

また、これらのようなサードパーティのツールがあります

EDIT:アプリケーションでGoogle PageSpeedを使用する場合は、ApacheまたはNginxのWebサーバーモジュールとして使用できます。ここであなたのウェブサイト用に設定する方法を見つけることができます

https://developers.google.com/speed/pagespeed/module/

ただし、アプリケーションにPageSpeed C++ライブラリを統合する場合は、ビルド手順をここで見つけることができます。

https://developers.google.com/speed/pagespeed/psol

また、Javaここにクライアントがあります

https://developers.google.com/api-client-library/Java/apis/pagespeedonline/v1

14
fujy

色の圧縮(「圧縮品質」)と解像度の圧縮(「サイズ変更」)があります。 Fujyの答えは圧縮品質を扱っていますが、これは主な節約の源泉ではありません。主な節約は、サイズを小さくしてサイズを小さくすることから来ます。例えば。 fujyの答えを使用して最大圧縮品質を使用して207MBに4MBの写真を取得し、ひどく見えましたが、妥当な品質でサイズを小さくして12Kに落としました。

したがって、上記のコードは「圧縮品質」に使用する必要がありますが、これはサイズ変更のための私の推奨事項です。

https://github.com/rkalla/imgscalr/blob/master/src/main/Java/org/imgscalr/Scalr.Java

リサイズが標準のJavaライブラリの一部であったことを願っていますが、そうではないようです(または標準の方法で画質の問題はありますか?)。 Mavenの使い方を学んだことがないので、このクラスをプロジェクトにコピーしただけで、うまく機能します。

4
Tim Cooper