Besoin de moyen plus Rapide pour obtenir la valeur RVB de chaque Pixel d'une Image Tamponnée
Quel est le moyen le plus rapide pour obtenir la valeur RVB de chaque pixel d'une BufferedImage
?
Droit maintenant j'obtiens les valeurs RVB à l'aide de deux for
boucle comme indiqué dans le code ci-dessous, mais il a fallu trop longtemps pour obtenir ces valeurs, comme la boucle imbriquée gère un total de 479999 fois pour mon image. Si j'utilise une image 16 bits de ce nombre serait encore plus élevé!
J'ai besoin d'un moyen plus rapide pour obtenir les valeurs des pixels.
Voici le code que j'suis en train d'essayer de travailler avec:
BufferedImage bi=ImageIO.read(new File("C:\\images\\Sunset.jpg"));
int countloop=0;
for (int x = 0; x <bi.getWidth(); x++) {
for (int y = 0; y < bi.getHeight(); y++) {
Color c = new Color(bi.getRGB(x, y));
System.out.println("red=="+c.getRed()+" green=="+c.getGreen()+" blue=="+c.getBlue()+" countloop="+countloop++);
}
}
it can even rise when i will use 16 bit image
- Pourquoi le nombre d'itérations dépend du nombre de bits par pixel? Et ce qui est le cas d'utilisation pour qui? Notez que la création d' Color
objets ainsi que l'impression à la console prend un certain temps. Si vous voulez accéder à toutes 479999 pixels vous ne pouvez pas vous débarrasser d'une boucle (vous pouvez les fusionner pour une, mais qui ne devrait pas faire grande différence).La production ralentit l'ensemble de la boucle vers le bas. À essayer sans.
Il pourrait aller beaucoup plus vite sans la println
Regarde ici stackoverflow.com/questions/4348613/...
Sortir les
System.out.println()
appels fera beaucoup plus rapidement. Vous pourriez peut-être définir c
à l'extérieur de la boucle, et même d'éviter l'instanciation d'un Color
si vous en avait besoin, mais ce n'est probablement pas nécessaire.OriginalL'auteur Jony | 2012-04-10
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si cela peut vous aider et je n'ai pas encore testé, mais vous pouvez obtenir les valeurs rvb de cette façon:
Comme vous pouvez le voir, vous n'avez pas à initialiser une nouvelle Couleur à l'intérieur de la boucle. J'ai également inversé la largeur/hauteur des boucles comme suggéré par onemasse pour récupérer le compteur de données j'ai déjà.
OriginalL'auteur mastaH
En changeant à partir d'un tas de personne getRGB est une grosse getRGB pour copier la totalité de l'image dans un tableau, le temps d'exécution a chuté par un ordre de grandeur de 33 000 millisecondes à 3 200 millisecondes, tandis que le temps de créer le tableau n'était que de 31 millisecondes.sans Aucun doute, une grande lecture dans un tableau et d'indexation directe de la matrice est beaucoup plus rapide que de nombreuses lectures.Performance différence semble liée à l'utilisation d'un point d'arrêt à la fin de la classe. Alors que le point d'arrêt a été en dehors de la boucle, chaque ligne de code au sein de la classe semble être testé pour le point d'arrêt. Modification de personne devient n'améliore PAS la vitesse.
Étant donné que le code est toujours correct, le reste de la réponse peut-être encore d'utiliser.
Vieux instruction de lecture
Lu la déclaration de copier une image binaire dans un tableau
La getRGB dans un tableau met tous les 3 valeurs de couleur dans un seul élément de tableau, les couleurs doivent être extraits par rotation et un "et". La coordonnée y doit être multipliée par la largeur de l'image.
Code pour lire les différentes couleurs de la matrice
OriginalL'auteur Fred F
Vous devriez boucle les lignes de la boucle externe et les colonnes à l'intérieur. De cette façon, vous éviterez les défauts de cache.
OriginalL'auteur onemasse
Avez-vous essayé BufferedImage.getRGB(int, int ,int ,int, int[] , int , int)?
Quelque chose comme:
N'ai pas essayé, donc pas sûr que si c'est plus rapide.
modifier
Ayant regardé @ le code, il n'est probablement pas, mais vaut la peine d'essayer.
OriginalL'auteur soulcheck
J'ai trouvé une solution ici
https://alvinalexander.com/blog/post/java/getting-rgb-values-for-each-pixel-in-image-using-java-bufferedi
OriginalL'auteur pipi