Java de la conversion de l'Image de BufferedImage
Il est déjà question comme ça lien sur StackOverflow et l'on a accepté la réponse est "casting":
Image image = ImageIO.read(new File(file));
BufferedImage buffered = (BufferedImage) image;
Dans mon programme, j'ai essayer:
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 j'obtiens erreur d'exécution:
soleil.awt.image.ToolkitImage ne peut pas être lancé à java.awt.image.BufferedImage
Évidemment casting ne fonctionne pas.
La Question est: Quelle est (ou est-il), la bonne façon de convertir l'Image à BufferedImage?
- si vous souhaitez mettre à l'échelle tampon d'image, essayez cette essayez cette [stackoverflow.com/questions/4216123/... [1]: stackoverflow.com/questions/4216123/...
- Pour l'enregistrement, il n'est PAS le compilateur qui est en train de dire que. Vous êtes en train de voir une erreur d'exécution ... pas d'erreur de compilation.
- Vous êtes de droite. Merci de souligner ce point. Je vais éditer la question en conséquence.
- Même si elles ne sont pas répondre à ma question directement: ce sont de grandes solutions.
- Une petite Chose pour l'OP: Méthode
ImageIO.read(File)
renvoie uneBufferedImage
par sa signature. (Référence) Il n'est pas nécessaire d'assigner d'abord à unImage
variable en fonte de typeBufferedImage
. Qui pourrait prêter à confusion à la lecture de votre code. - J'ai pensé qu'il est tout à fait clair que la partie de code que vous mentionnez n'est pas mine de. Je l'ai écrit dans la question - ce qui est "accepté de répondre" à partir d'un question similaire sur DONC.
- Pourquoi avez-vous tout d'abord créer un
Image
l'objet, puis de la convertir en uneBufferedImage
, lorsque vous avez la possibilité de créer unBufferedImage
depuis le début?
Vous devez vous connecter pour publier un commentaire.
À partir d'un Java Le Moteur De Jeu:
Image
à unBufferedImage
. Vous ne devriez pas vous soucier de la mémoire lors de l'utilisation de Java.Image
n'est pas encore chargé, depuisgetWidth(null)
ougetHeight(null)
sera de retour-1
dans le casBufferedImage.TYPE_INT_RGB
au lieu de ARGB pour obtenir les couleurs de mon vignette à droiteUne façon de gérer cela est de créer un nouveau BufferedImage, et dites-lui de l'objet graphique pour dessiner votre image à l'échelle dans le nouveau BufferedImage:
Cela devrait faire l'affaire sans casting.
Si vous obtenez de retour d'un
sun.awt.image.ToolkitImage
, vous pouvez convertir l'Image, et ensuite utiliser getBufferedImage() pour obtenir leBufferedImage
.Ainsi, au lieu de votre dernière ligne de code où vous lancez un sort, vous faites juste:
sun
paquet. Ils ne sont pas garantis pour être disponible dans la non-Oracle Jdk. 2) la MéthodegetBufferedImage()
ne fonctionne que si le tampon d'image a été générée en interne parTookitImage
. Le plus souvent (99%), il n'est pas, de sorte que la valeur de retour estnull
. SourceSi vous utilisez Kotlin, vous pouvez ajouter une extension de la méthode à l'Image de la même manière Sri Harsha Chilakapati suggère.
Et de l'utiliser comme ceci: