Comment faire pour recadrer une image en Java?
Je veux recadrer une image manuellement à l'aide de la souris.
Supposons que l'image a un peu de texte, et je veux sélectionner du texte à partir d'une image, puis
à cette fin, je veux des cultures de cette zone à l'aide de la souris.
- Plusieurs bonnes idées ci-dessous. Voir aussi java.sun.com/docs/books/tutorial/2d
- Hussain: donner l'un de ces réponses détaillées de la vérification
Vous devez vous connecter pour publier un commentaire.
La solution que j'ai trouvé le plus utile pour recadrer un tampon d'image utilise le getSubImage(x,y,w,h);
Mon recadrage routine fini par ressembler à ceci:
BufferedImage dest = src.getSubimage(rect.x, rect.y, rect.width, rect.height);
Il y a deux potentiellement problème majeur avec les leaders de la réponse à cette question. Tout d'abord, comme pour les docs:
Essentiellement, ce que cela signifie, c'est que le résultat de getSubimage agit comme un pointeur qui pointe sur un paragraphe de l'image d'origine.
Pourquoi est-ce important? Eh bien, si vous envisagez de modifier le sous-image pour une raison quelconque, les modifications arrivera aussi à l'image d'origine. Par exemple, j'ai rencontré ce problème lorsque j'ai été en utilisant la petite image dans une fenêtre séparée pour un zoom avant sur l'image d'origine. (un peu comme une loupe). Je l'ai fait possible d'inverser les couleurs pour voir certains détails plus facilement, mais la zone qui a été "zoomé" a également obtenu inversé dans l'image d'origine! Alors il y a une petite section de l'image d'origine qui avait inversé les couleurs, tandis que le reste est restée normale. Dans de nombreux cas, cela n'a pas d'importance, mais si vous souhaitez modifier l'image, ou si vous voulez juste une copie recadrée de l'article, vous pourriez envisager une méthode.
Qui nous amène au deuxième problème. Heureusement, il n'est pas un problème aussi grand que le premier. getSubImage partage le même tableau de données que l'image d'origine. Cela signifie que l'ensemble de l'image originale est toujours stocké dans la mémoire. En supposant que par la "culture" de l'image que vous voulez vraiment une image plus petite, vous aurez besoin de redessiner une nouvelle image plutôt que de simplement obtenir la sous-image.
Essayez ceci:
Cette technique va vous donner l'image recadrée vous êtes à la recherche par lui-même, sans le lien vers l'image d'origine. Cela permettra de préserver l'intégrité de l'image d'origine ainsi que vous faire économiser la charge de la mémoire de stockage de l'image plus grande. (Si vous ne le vidage de l'image d'origine plus tard)
C'est une méthode qui fonctionne:
Bien sûr, vous avez à faire votre propre JComponent:
Je n'ai pas le tester. Peut-être il y a quelques erreurs (je ne suis pas sûr de toutes les importations).
Vous pouvez mettre le
crop(img, rect)
méthode dans cette classe.Espérons que cette aide.
Cette question n'a pas assez d'informations pour répondre. Une solution générale (en fonction de votre interface framework): ajouter une souris gestionnaire d'événement qui va attraper les clics et les mouvements de la souris. Cela vous donnera votre (x, y) les coordonnées. Ensuite utiliser ces coordonnées pour recadrer votre image.
Vous devez lire à propos de Java Image de l'API et de la souris liées à l'API, peut-être quelque part dans le
java.awt.event package
.Pour commencer, vous devez être en mesure de charger et d'afficher l'image à l'écran, vous pourrez peut-être utiliser un
JPanel
.Puis à partir de là, vous essayez de mettre en œuvre un mouvement de la souris auditeur de l'interface et d'autres interfaces. Peut-être que vous aurez lié sur la
mouseDragged
méthode...Pour un
mousedragged
action, vous obtiendrez les coordonnées du rectangle de forme par glisser...Puis, à partir de ces coordonnées, vous obtiendrez la sous-image à partir de l'image que vous avez et vous sorte de redessiner à nouveau....
Et puis afficher l'image recadrée... je ne sais pas si cela va fonctionner, mais seulement un produit de mon imagination... juste une pensée!
Je donne cet exemple parce que c'est en fait le travail pour mon cas d'utilisation.
J'ai essayé d'utiliser le AWS Rekognition API.
L'API renvoie une boîte englobante de l'objet:
Le code ci-dessous utilise pour recadrer l'image: