Publié le 08/09/2010
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
2 commentaires

Redimensionner une image avec BufferedImage

Java dispose de toutes les librairies pour redimensionner une image sans trop perdre de qualité. En quelques lignes de code, une image peut etre agrandit ou réduite en conservant les mêmes proportions.

Agrandir ou réduire une image

A l'aide de Graphics2D, une image peut facilement ętre réduite ou agrandie. Pour illustrer le redimensionnement d'une image avec BufferedImage, les opérations suivantes sont effectuées sur une image:
- charger une image PNG avec ImageIO,
- réduction ou agrandissement en appliquant une coefficient de redimensionnement,
- enregistrer la nouvelle image PNG avec ImageIO.
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
 
/**
 * Redimensionner une image
 */
public class ImageRedim {
 
    public static BufferedImage scale(BufferedImage bImage, double factor) {
        int destWidth=(int) (bImage.getWidth() * factor);
        int destHeight=(int) (bImage.getHeight() * factor);
//créer l'image de destination
        GraphicsConfiguration configuration = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
        BufferedImage bImageNew = configuration.createCompatibleImage(destWidth, destHeight);
        Graphics2D graphics = bImageNew.createGraphics();
        graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
        //dessiner l'image de destination
        graphics.drawImage(bImage, 0, 0, destWidth, destHeight, 0, 0, bImage.getWidth(), bImage.getHeight(), null);
        graphics.dispose();
 
        return bImageNew;
    }
 
    public static void main(String[] args) {
        try {
            //Exemple pour agrandir
            BufferedImage img = ImageIO.read(new File("c:/j.png"));
            BufferedImage imgnew=scale(img, 10);
            ImageIO.write(imgnew, "png", new File("c:/jgrand.png"));
 
            //Exemple de reduction
            BufferedImage imag = ImageIO.read(new File("c:/j.png"));
            BufferedImage imagnew=scale(img, 0.5);
            ImageIO.write(imagnew, "png", new File("c:/jpetit.png"));
        } catch (IOException ex) {
            Logger.getLogger(ImageRedim.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}


La class a été construite pour redimensionner les images à la volé, c''est à dire les images d'origine reste intacte et seules les images affichées dans l'application sont réduites. Pour sauvegarder les nouvelles images, on peut utiliser un fileWrite ou la lib ImageIO.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.
avatar Mohamed

Publié par Mohamed

le 13/10/2011 à 18:55:08

Merci beaucoup j'ai eu un probleme de redimensionnement des images , mes images perdaient leur qualite, ta solution m'a aide pour ca mercii

avatar bob le poisson

Publié par bob le poisson

le 06/07/2012 à 20:00:38

Bonjour, votre script est tres bien mais attention l'utilisation du mot cle static sur la methode scale(BufferedImage bImage, double factor) est inutile et empeche de liberer la ressource.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
java - sources
Mise a jour
08/09/2010
Visualisation
vu 6957 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 264 articles
|BIO_PSEUDO|
Commentaires récents

Publié par nico dans java

Petite erreur constate.
Apparemment il faut remplacer :
&mailTo = &?body=Envoyer un email avec Java
par &mailTo = < et commercial sans '<' et '>' &body=Envoyer un email avec Java

Publié par Souti dans php5

Merci pour ce code. Trs utile.

Pour mon cas, il a fallu que j'ajoute une } avant ?> le pour fermer le for each.

Publié par leflo dans php5

Bonjour
Sans parler du fait que l'IP peut ne pas vouloir dire grand chose, en cas de proxy/translation comment on fait? On voit pas et on interdit tout meme si l'utilisateur n'est pas responsa...

Publié par robbie dans tuto

desole pour le message en multiple j'ai eu un ptit beug

Publié par fobec dans logiciel

MAJ: mise en cache du FAI et optimisation du script de Geolocalisation.