Problème manipulation image

cs_lebienestrare Messages postés 96 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 23 mars 2008 - 9 mars 2008 à 03:28
cs_lebienestrare Messages postés 96 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 23 mars 2008 - 14 mars 2008 à 17:36
Bonjour tout le monde,
j'ai réussi à importer mes images dans une applet, mais je me demande comment est ce qu'on peut faire une sorte de duplication des images, ça veut en faire plusieurs dans l'applet
merci, ps: j'ai implémenté l'image directement dans l'applet sans utilisation de classes.

9 réponses

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
9 mars 2008 à 07:50
Si tu veus afficher la même image plusieurs fois, alors il ne faut pas nécessairement la copier. Si tu veus vraiment copier l'image, alors tu peus créer d'abord un nouveau BufferedImage. Ensuite tu peus dessiner l'original dessus en utilisant Graphics.drawImage(). Exemple:

    private Image copyImage(Image img) {
        int w = img.getWidth(null);
        int h = img.getHeight(null);
        BufferedImage imgCopy = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = imgCopy.createGraphics();
        g2.drawImage(img, 0, 0, w, h, null);
        g2.dispose();
        return imgCopy;
    }
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
9 mars 2008 à 12:01
Salut:

uhrand >> Il faut déterminer si l'image contient un channel Alpha pour utiliser la constante TYPE_INT_ARGB, sinon il faut utiliser la constante TYPE_INT_RGB.

Ceci assure qu'on obtient une copie conforme de l'image d'origine.

Petite modification de code précédant:

public static boolean hasAlpha(Image image) {
        if (image instanceof BufferedImage) {
            BufferedImage bimage = (BufferedImage)image;
            return bimage.getColorModel().hasAlpha();
        }
   
        PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
        try {
            pg.grabPixels();
        } catch (InterruptedException e) {
        }

        ColorModel cm = pg.getColorModel();
        return cm.hasAlpha();
}

private Image copyImage(Image img) {
        int w = img.getWidth(null);
        int h = img.getHeight(null);
        int imageType = (hasAlpha() ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB);
        BufferedImage imgCopy = new BufferedImage(w, h, imageType);
        Graphics2D g2 = imgCopy.createGraphics();
        g2.drawImage(img, 0, 0, w, h, null);
        g2.dispose();
        return imgCopy;
}
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
9 mars 2008 à 14:48
Salut:

Une petite correction:

public static boolean hasAlpha(Image image) {
        if (image instanceof BufferedImage) {
            BufferedImage bimage = (BufferedImage)image;
            return bimage.getColorModel().hasAlpha();
        }
   
        PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
        try {
            pg.grabPixels();
        } catch (InterruptedException e) {
        }

        ColorModel cm = pg.getColorModel();
        return cm.hasAlpha();
}

private Image copyImage(Image img) {
        int w = img.getWidth(null);
        int h = img.getHeight(null);
        int imageType = (hasAlpha(img)?BufferedImage.TYPE_INT_ARGB:BufferedImage.TYPE_INT_RGB);
        BufferedImage imgCopy = new BufferedImage(w, h, imageType);
        Graphics2D g2 = imgCopy.createGraphics();
        g2.drawImage(img, 0, 0, w, h, null);
        g2.dispose();
        return imgCopy;
}
0
cs_lebienestrare Messages postés 96 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 23 mars 2008
9 mars 2008 à 17:54
bonjour,
merci beaucoup pour vos réponses, en fait j'ai fait la méthode que vous m'avez dite, mais malheureusement rien ne s'affiche ,  j'appelle cette fct dans init() de l'applet
merci bcp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
9 mars 2008 à 21:37
Salut:

Est ce que tu peux nous donner un aperçu de ton code?

Bon courage ...
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
10 mars 2008 à 23:59
> Il faut déterminer si l'image contient un channel Alpha
pour utiliser la constante TYPE_INT_ARGB, sinon il > faut utiliser la
constante TYPE_INT_RGB.

Oui, j'ai peut-être un peu trop simplifié. En cas de BufferedImage on peut le faire aussi comme ceci:int type (img.getTransparency() Transparency.OPAQUE) ?
    BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
13 mars 2008 à 20:05
Salut:

Utilises cette méthode:

public static Image copyImage(Image image) {
    if (image == null) {
       return null;
    }

    if (image instanceof BufferedImage) {
       int w = ((BufferedImage)image).getWidth();
       int h  = ((BufferedImage)image).getHeight();
       return ((BufferedImage)image).getSubimage(0, 0, w, h);
    }
    if (image instanceof Image) {
       int w = image.getWidth(null);
       int h = image.getHeight(null);
       return Toolkit.getDefaultToolkit().createImage(
           new FilteredImageSource(image.getSource(), new CropImageFilter(0, 0, w, h))
       );
    }
    return null;
}

J'ai testé cette méthode avant de la poster elle marche bien.

Note: Quand tu passe en paramètre un BufferedImage n'oublies pas de faire un casting:

BufferedImage src = ImageIO.read(new File("image.gif")) ;
BufferedImage cpy = (BufferedImage)copyImage(src);

Bon courage ...
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
13 mars 2008 à 20:05
Salut:

Utilises cette méthode:

public static Image copyImage(Image image) {
    if (image == null) {
       return null;
    }

    if (image instanceof BufferedImage) {
       int w = ((BufferedImage)image).getWidth();
       int h  = ((BufferedImage)image).getHeight();
       return ((BufferedImage)image).getSubimage(0, 0, w, h);
    }
    if (image instanceof Image) {
       int w = image.getWidth(null);
       int h = image.getHeight(null);
       return Toolkit.getDefaultToolkit().createImage(
           new FilteredImageSource(image.getSource(), new CropImageFilter(0, 0, w, h))
       );
    }
    return null;
}

J'ai testé cette méthode avant de la poster elle marche bien.

Note: Quand tu passe en paramètre un BufferedImage n'oublies pas de faire un casting:

BufferedImage src = ImageIO.read(new File("image.gif")) ;
BufferedImage cpy = (BufferedImage)copyImage(src);

Bon courage ...
0
cs_lebienestrare Messages postés 96 Date d'inscription samedi 6 mai 2006 Statut Membre Dernière intervention 23 mars 2008
14 mars 2008 à 17:36
salut, merci pour votre aide,
Ombitios, ta méthode n'a pas marché pr moi, pt etre c dû a une erreur d'implémentation que je fais...
en tt cas, j'ai atteint mon but, et j'ai réalisé ce que je voulais râce a des classes,
merci encore, bonne journée
0
Rejoignez-nous