Travailler avec les images en Java : bibliothèques, outils et exemples de code
Java offre des outils intégrés puissants pour travailler avec les graphiques, ainsi qu'un riche écosystème de bibliothèques tierces. Dans cet article, nous examinerons les principales méthodes de chargement, de traitement, de transformation et de sauvegarde d'images en Java — des classes standard javax.imageio et java.awt aux bibliothèques populaires qui simplifient la vie du développeur.
1. Outils standard : javax.imageio et java.awt.image
Le travail de base avec les images matricielles en Java repose sur le package javax.imageio (chargement/sauvegarde) et java.awt.image (travail avec les pixels). La classe principale est BufferedImage, qui stocke l'image en mémoire vive.
Chargement et sauvegarde d'une image
import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;
public class ImageExample { public static void main(String[] args) throws IOException { // Chargement d'une image depuis un fichier BufferedImage image = ImageIO.read(new File("input.jpg")); System.out.println("Largeur : " + image.getWidth() + ", Hauteur : " + image.getHeight());
// Sauvegarde dans un autre format ImageIO.write(image, "png", new File("output.png")); }}ImageIO prend en charge les formats : JPEG, PNG, BMP, WBMP, GIF (lecture uniquement). Pour étendre la liste des formats, utilisez les plugins ImageIO (par exemple, TwelveMonkeys).
Redimensionnement (méthode manuelle)
import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;
public static BufferedImage resize(BufferedImage original, int newWidth, int newHeight) { BufferedImage resized = new BufferedImage(newWidth, newHeight, original.getType()); Graphics2D g2d = resized.createGraphics(); g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.drawImage(original, 0, 0, newWidth, newHeight, null); g2d.dispose(); return resized;}2. API Java 2D : dessin et filtres
La classe Graphics2D permet non seulement de redimensionner, mais aussi d'appliquer des effets, de faire pivoter, de recadrer des images, d'ajouter du texte et des formes géométriques.
Ajout d'un filigrane
public static BufferedImage addWatermark(BufferedImage source, String text) { BufferedImage result = new BufferedImage(source.getWidth(), source.getHeight(), source.getType()); Graphics2D g2d = result.createGraphics(); g2d.drawImage(source, 0, 0, null); g2d.setColor(new Color(255, 255, 255, 128)); g2d.setFont(new Font("Arial", Font.BOLD, 40)); g2d.drawString(text, 20, source.getHeight() - 20); g2d.dispose(); return result;}Application d'un filtre de couleur (sépia)
public static BufferedImage applySepia(BufferedImage img) { int width = img.getWidth(); int height = img.getHeight(); BufferedImage sepia = new BufferedImage(width, height, img.getType());
for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int rgb = img.getRGB(x, y); int r = (rgb >> 16) & 0xFF; int g = (rgb >> 8) & 0xFF; int b = rgb & 0xFF;
int newR = (int) (0.393 * r + 0.769 * g + 0.189 * b); int newG = (int) (0.349 * r + 0.686 * g + 0.168 * b); int newB = (int) (0.272 * r + 0.534 * g + 0.131 * b);
newR = Math.min(255, newR); newG = Math.min(255, newG); newB = Math.min(255, newB);
int newPixel = (0xFF << 24) | (newR << 16) | (newG << 8) | newB; sepia.setRGB(x, y, newPixel); } } return sepia;}