72 votes

Java convertit une image en BufferedImage

Il y a déjà une question comme celle-ci enlace sur StackOverflow et la réponse acceptée est "casting" :

Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;

Dans mon programme, j'essaie :

final float FACTOR  = 4f;
BufferedImage img = ImageIO.read(new File("graphic.png"));
int scaleX = (int) (img.getWidth() * FACTOR);
int scaleY = (int) (img.getHeight() * FACTOR);
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);
BufferedImage buffered = (BufferedImage) image;

Malheureusement, je reçois une erreur d'exécution :

sun.awt.image.ToolkitImage ne peut pas être converti en java.awt.image.BufferedImage

Il est évident que le casting ne fonctionne pas.
La question est la suivante : Quelle est (ou quelle est) la bonne manière de convertir une image en BufferedImage ?

107voto

Désolé, je ne peux pas taper sur la tablette.

Voir http://code.google.com/p/game-engine-for-java/source/browse/src/com/gej/util/ImageTool.java#31

EDITAR:

Voici la même méthode.

/**
 * Converts a given Image into a BufferedImage
 *
 * @param img The Image to be converted
 * @return The converted BufferedImage
 */
public static BufferedImage toBufferedImage(Image img)
{
    if (img instanceof BufferedImage)
    {
        return (BufferedImage) img;
    }

    // Create a buffered image with transparency
    BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);

    // Draw the image on to the buffered image
    Graphics2D bGr = bimage.createGraphics();
    bGr.drawImage(img, 0, 0, null);
    bGr.dispose();

    // Return the buffered image
    return bimage;
}

20voto

salbeira Points 437

Une façon de gérer cette situation est de créer une nouvelle BufferedImage, et de dire à son objet graphique de dessiner votre image mise à l'échelle dans la nouvelle BufferedImage :

final float FACTOR  = 4f;
BufferedImage img = ImageIO.read(new File("graphic.png"));
int scaleX = (int) (img.getWidth() * FACTOR);
int scaleY = (int) (img.getHeight() * FACTOR);
Image image = img.getScaledInstance(scaleX, scaleY, Image.SCALE_SMOOTH);
BufferedImage buffered = new BufferedImage(scaleX, scaleY, TYPE);
buffered.getGraphics().drawImage(image, 0, 0 , null);

Cela devrait faire l'affaire sans couler.

3voto

Herminator Points 1319

Si vous recevez un sun.awt.image.ToolkitImage vous pouvez y intégrer l'image, et ensuite utiliser getBufferedImage() pour obtenir le BufferedImage .

Ainsi, à la place de votre dernière ligne de code où vous effectuez un casting, vous feriez simplement :

BufferedImage buffered = ((ToolkitImage) image).getBufferedImage();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X