Existe-t-il un moyen simple de comparer les instances BufferedImage?
Je suis en train de travailler sur une partie d'une application Java qui prend une image comme un tableau d'octets, lit dans un java.awt.image.BufferedImage
instance et le passe à un tiers bibliothèque pour le traitement.
Pour une unité de test, je veux prendre une image (à partir d'un fichier sur le disque) et affirmer que c'est la même image qui a été traitée par le code.
- Mon devrait
BufferedImage
est lu à partir d'un fichier PNG sur le disque à l'aide deImageIO.read(URL)
. - Mon test code lit le même fichier dans un
BufferedImage
et écrit sur un tableau d'octets en tant que fichiers PNG à fournir au système sous test.
Lorsque le système sous test écrit le tableau d'octets pour une nouvelle BufferedImage
je tiens à affirmer que les deux images sont identiques dans une manière significative. À l'aide de equals()
(héritée de Object
) ne fonctionne pas (bien sûr). En comparant BufferedImage.toString()
valeurs aussi ne fonctionne pas parce que la chaîne de sortie comprend la référence d'objet d'information.
Quelqu'un sait tous les raccourcis? Je préfère ne pas apporter à un tiers de la bibliothèque pour une seule unité de test dans une petite partie d'une grande application.
source d'informationauteur pharsicle
Vous devez vous connecter pour publier un commentaire.
C'est la meilleure approche. Pas besoin de garder une variable pour dire si l'image est toujours égal. Il suffit de le retourner false immédiatement lorsque la condition si la valeur est false. Court-circuit d'évaluation permet de gagner du temps en boucle de plus de pixels après l'échec de la comparaison comme c'est le cas dans trumpetlick de réponse.
Si la vitesse est un problème, et les deux
BufferedImages
sont de la même profondeur de bits, arrangement, etc. (il semble que ça doit être vrai ici), vous pouvez le faire:comprendre à quel type il est, par exemple, un
DataBufferInt
faire un peu de "vérifications" égaux sur les tailles et les banques de la DataBuffers, puis la boucle
C'est presque aussi vite que vous pouvez obtenir de la cause que vous prenez un bloc de données à un moment, pas un seul à la fois.
Vous pouvez écrire votre propre routine à des fins de comparaison!
Ce serait un moyen!!!
J'ai changé la fonction est égale par pixels en Groovy, peut être utile:
Je ne peux pas penser à autre chose qu'à une attaque par force brute "boucle":
Vous pouvez écrire que l'image via
imageio
par le biais d'unOutputStream
à unbyte[]
.Dans mon code, c'est plus ou moins comme ceci:
fonctionne bien, mais pas efficace