web-dev-qa-db-fra.com

Comment puis-je compresser des images en utilisant Java?

À partir de la vitesse de rotation, je n’obtiens que le lien de l’image et les optimisations possibles en octets et en pourcentage, par exemple, La compression et le redimensionnement https://example.com/…ts/xyz.jpg?036861 pourraient vous faire économiser 212 Ko (réduction de 51%) . La compression https://example.com/…xyz.png?303584508 pourrait vous faire économiser 4,4 Ko (réduction de 21%).

Pour un exemple, j'ai une image de taille 300 Ko et pour cette image vitesse de rotation affiche 100 Ko & 30% de réduction.

Ceci est seulement pour une image mais je suis sûr que je vais avoir beaucoup d'images pour la compression . Alors, comment puis-je compresser l'image en passant des octets ou un pourcentage en tant que paramètre ou en utilisant d'autres calculs en Java (en utilisant l’API ou l’outil de traitement d’image) afin que je puisse obtenir une version compressée de l’image comme suggéré par google.

Merci d'avance.

6
Darshit Patel

Vous pouvez utiliser Java ImageIO package pour compresser de nombreux formats d’images. Voici un exemple.

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();
  }
}

Vous pouvez trouver plus de détails à ce sujet ici

En outre, il existe des outils tiers comme ceux-ci

EDIT: Si vous souhaitez utiliser Google PageSpeed dans votre application, il est disponible en tant que module de serveur Web pour Apache ou Nginx. Vous pouvez trouver comment le configurer pour votre site Web ici

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

Mais si vous souhaitez intégrer la bibliothèque PageSpeed C++ à votre application, vous pouvez trouver les instructions de construction correspondantes ici.

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

Il a également un client Java ici

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

12
fujy

Il y a compression de la couleur ("qualité de compression") et compression de la résolution ("redimensionnement"). La réponse de Fujy traite de la qualité de la compression, mais ce n’est pas de là que proviennent les principales économies: les principales économies proviennent du redimensionnement plus petit. Par exemple. J'ai obtenu une photo de 4mb à 207K en utilisant la qualité de compression maximale en utilisant la réponse de Fujy, et elle avait l'air horrible, mais je l'ai réduite à 12K en utilisant une qualité raisonnable mais une taille plus petite.

Donc, le code ci-dessus devrait être utilisé pour "la qualité de la compression", mais voici ma recommandation pour le redimensionnement:

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

J'aimerais que le redimensionnement fasse partie des bibliothèques Java standard, mais il semble que ce ne soit pas le cas (ou que les méthodes standard posent des problèmes de qualité d'image?). Mais la bibliothèque de Riyad est vraiment petite - c'est juste une classe. Je viens de copier cette classe dans mon projet, car je n’ai jamais appris à utiliser Maven et cela fonctionne très bien.

1
Tim Cooper