Comment cloner un BufferedImage
J'ai un objet qui a beaucoup de bufferedimages en elle, je veux créer un nouvel objet la copie de tous les bufferedimages dans le nouvel objet, mais ces nouvelles images peuvent être modifiées et je ne veux pas l'objet d'origine des images pour être changé en modifiant les nouveaux objets images.
est-ce clair?
Est-ce possible de le faire et n'importe qui peut suggérer une bonne façon de le faire s'il vous plaît?
J'ai pensé à getSubImage mais lu quelque part que tout changement à la sous-image sont relected à la maison mère de l'image.
Je veux juste être en mesure d'obtenir une nouvelle entièrement distincte de copier ou cloner un BufferedImage
- ne pouvez-vous pas appel à la
clone()
méthode? Ou ai-je raté quelque chose? Je ne sais pas beaucoup au sujet de laBufferedImage
classe - clone ne fournit une copie des références à la mémoire tampon d'images, pas des copies.
- UltimateGobblement:
BufferedImage
ne pas mettre en œuvreCloneable
et laclone()
méthode a un accès protégé.
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme cela?
BufferedImage
après le clonage?Je fais ceci:
Il fonctionne assez bien et il est simple à utiliser.
Mentionnées précédemment, la procédure échoue lorsqu'elle est appliquée à des sous-images. Voici une solution plus complète:
Classe BufferedImage ne pas mettre en œuvre la Clonable interface. Ainsi, la méthode clone n'est pas surchargée. Voici une alternative pour une copie en profondeur la technique:
Java Astuce 76: Une alternative à la technique de copie en profondeur
Une autre méthode consiste à utiliser le
Graphics2D
classe pour dessiner l'image sur une nouvelle image vide. Ce n'est pas vraiment le clone de l'image, mais il en résulte une copie de l'image produite.Je sais que cette question est assez vieux, mais pour les futurs visiteurs, voici la solution que j'utilise:
S'il vous plaît corrigez-moi si la modification de la juste obtenu
newImage
affecte également l'image d'origine en quelque sorte.--> Javadoc pour getScaledInstance
--> Javadoc pour SCALE_DEFAULT (les autres constantes sont inscrit juste en dessous de celle-là)
Image
, pasBufferedImage
.Cela a été incroyablement utile pour un programme que j'utilise pour dessiner des trucs, et a été incapable de mettre en œuvre Undo/Redo unis en raison de la BufferedImages sur les Piles étant pratiquement la même chose.
Par le chemin, je suggère à tous la voie à l'aide d'un couple de meules pour ce genre d'opérations!
Chaque fois que vous faites quelque chose, immédiatement à la création d'une nouvelle image, utilisez la propriétédeepcopy méthode mentionnée ci-dessus
modifier l'image que vous s'il vous plaît, puis lorsque vous arrêtez d'édition (comme lorsque vous relâchez le bouton de la souris) ne
et toujours peindre l'élément au sommet de la gauche de la pile de
et puis si vous faites un peu de défaire/refaire l'opération, suivez quelque chose comme cela
assurez-vous de toujours laisser quelque chose à la gauche de la pile, parce que pour la peinture, il utilise toujours l'élément du haut (peek) de celui-ci!