Je suis à la recherche du moyen le plus rapide d'obtenir des données de pixels (dans le formulaire int[][]
) à partir d'un fichier BufferedImage
. Mon objectif est de pouvoir adresser le pixel (x, y)
de l'image en utilisant int[x][y]
. Toutes les méthodes que j'ai trouvées ne le font pas (la plupart retournent int[]
).
118
getRGB
etsetRGB
directement?getRGB
etsetRGB
directement.Réponses:
Je jouais juste avec ce même sujet, qui est le moyen le plus rapide d'accéder aux pixels. Je connais actuellement deux façons de procéder:
getRGB()
méthode de BufferedImage comme décrit dans la réponse de @ tskuzzy.En accédant directement au tableau de pixels en utilisant:
Si vous travaillez avec de grandes images et que les performances sont un problème, la première méthode n'est absolument pas la voie à suivre. La
getRGB()
méthode combine les valeurs alpha, rouge, verte et bleue en un seul entier, puis renvoie le résultat, ce qui dans la plupart des cas, vous ferez l'inverse pour récupérer ces valeurs.La deuxième méthode retournera les valeurs rouge, verte et bleue directement pour chaque pixel, et s'il y a un canal alpha, elle ajoutera la valeur alpha. L'utilisation de cette méthode est plus difficile en termes de calcul d'indices, mais elle est beaucoup plus rapide que la première approche.
Dans mon application, j'ai pu réduire le temps de traitement des pixels de plus de 90% en passant simplement de la première approche à la seconde!
Voici une comparaison que j'ai configurée pour comparer les deux approches:
Pouvez-vous deviner la sortie? ;)
la source
convertTo2DUsingGetRGB
etconvertTo2DWithoutUsingGetRGB
. Le premier test dure en moyenne 16 secondes. Le deuxième test dure en moyenne 1,5 seconde. Au début, je pensais que les «s» et «ms» étaient deux colonnes différentes. @Mota, excellente référence.BufferedImage
detype
par exemple ,TYPE_INT_RGB
ouTYPE_3BYTE_BGR
et poignée de façon appropriée. C'est l'une des choses quigetRGB()
fait pour vous, qui|=
au lieu de+=
combiner les valeurs de la méthode 2?Quelque chose comme ça?
la source
BufferedImage
stocké les pixels en utilisant un tableau 2D int, de toute façon?Raster
mémoire tampon de données du, ce qui est certainement une bonne chose car cela entraîne une accélération de la course.J'ai trouvé que la réponse de Mota m'a donné une augmentation de vitesse de 10 fois - alors merci Mota.
J'ai enveloppé le code dans une classe pratique qui prend BufferedImage dans le constructeur et expose une méthode getRBG (x, y) équivalente qui en fait une goutte de remplacement pour le code utilisant BufferedImage.getRGB (x, y)
la source
La réponse de Mota est excellente à moins que votre BufferedImage ne provienne d'un bitmap monochrome. Un bitmap monochrome n'a que 2 valeurs possibles pour ses pixels (par exemple 0 = noir et 1 = blanc). Lorsqu'un bitmap monochrome est utilisé, le
call renvoie les données brutes de la matrice de pixels de telle sorte que chaque octet contient plus d'un pixel.
Ainsi, lorsque vous utilisez une image bitmap monochrome pour créer votre objet BufferedImage, c'est l'algorithme que vous souhaitez utiliser:
la source
Si cela est utile, essayez ceci:
la source
Voici une autre implémentation FastRGB trouvée ici :
Qu'est-ce que c'est?
La lecture d'une image pixel par pixel via la méthode getRGB de BufferedImage est assez lente, cette classe est la solution pour cela.
L'idée est que vous construisez l'objet en lui fournissant une instance de BufferedImage, et il lit toutes les données à la fois et les stocke dans un tableau. Une fois que vous voulez obtenir des pixels, vous appelez getRGB
Dépendances
Considérations
Bien que FastRGB accélère la lecture des pixels, il peut entraîner une utilisation élevée de la mémoire, car il stocke simplement une copie de l'image. Donc, si vous avez une BufferedImage de 4 Mo dans la mémoire, une fois que vous avez créé l'instance FastRGB, l'utilisation de la mémoire devient 8 Mo. Vous pouvez toutefois recycler l'instance BufferedImage après avoir créé le FastRGB.
Veillez à ne pas tomber dans OutOfMemoryException lorsque vous l'utilisez sur des appareils tels que les téléphones Android, où la RAM est un goulot d'étranglement
la source
Cela a fonctionné pour moi:
la source
i
?