Je fais un éditeur d'image de base pour améliorer mes compétences en processus d'image. J'ai 12 filtres (pour l'instant).
Tous les filtres ont un jlabel cliquable qui a une image
Je mettez à jour les images de tous lorsque tous les filtres s'appliquent avec cette fonction: Tous les filtres ont une fonction de processus comme celle-ci: P> public BufferedImage process(BufferedImage base) {
BufferedImage product = new BufferedImage(base.getWidth(), base.getHeight(), base.getType());
for(int indisY = 0; indisY < base.getHeight(); indisY++){
for(int indisX = 0; indisX < base.getWidth(); indisX++){
Color currentColor = new Color(base.getRGB(indisX, indisY));
int greyTone = 0;
greyTone = (int) (currentColor.getRed()*0.315) +
(int) (currentColor.getGreen()*0.215)
+ (int) (currentColor.getBlue()*0.111);
product.setRGB(indisX, indisY, new Color(greyTone,greyTone,greyTone).getRGB());
}
}
return product;
}
3 Réponses :
Vous devez vous rappeler que 3000 * 5000 est de 15 000 000, vous créez donc 15 000 000 objets de couleur, vous appelez SETRGB 15 000 000 fois. Si j'étais vous, je regarderais potentiellement utiliser Forkjoinpool pour cela. P>
Je suis d'accord avec @jason - le problème est que vous créez (et détruisez) 15 millions d'objets de couleur. P>
Cependant, je ne pense pas que l'utilisation de plusieurs threads vous obtiendra suffisamment d'une augmentation de la performance, car vous allez toujours mettre beaucoup de pression sur la mémoire et le collecteur des ordures, car vous allez toujours Créer et détruire 15 millions d'objets, vous ferez simplement plusieurs en parallèle. P>
Je pense que vous pouvez tous les deux rester à l'écart de la création d'objets de couleur entièrement et de faire moins de boucles, en utilisant le résultat de la Le truc est de pouvoir convertir la valeur de couleur int en une valeur grise (ou tout ce que vous devez faire d'autre que vous devez faire) sans séparer les valeurs R, g et B, ou à trouver un moyen efficace de séparer R, G, et B - plus efficace que la création, l'utilisation et la destruction d'un objet de couleur. p>
Pour un plomb sur Obtenir des valeurs R, G et B de l'INT renvoyé par GetRGB (), notez que la documentation de "Retourne la valeur RVB représentant la couleur dans la SRGB par défaut
Colormodel. (Les bits 24-31 sont alpha, 16-23 sont rouges, 8-15 sont verts, 0-7
sont bleus). " P>
blockQuote>
Une fois que vous avez travaillé, vous pouvez penser à la paralléliser. P> bufferedimage code> de classe '
getRGB () code> méthode directement , au lieu de créer un objet de couleur. En outre, vous pouvez utiliser la surcharge de
getRGB () code> qui renvoie une gamme d'INTS, pour obtenir, dire, une rangée de pixels (ou plus) à la fois pour réduire le nombre d'appels que vous avez faire entrer dans la boucle. Vous pouvez également utiliser la version de
setrgb () code> qui prend une matrice de valeurs de pixels. P>
color.getrgb () code> dit, P>
Je ne peux pas comprendre cette fonction surchargée pouvez-vous écrire comme pseudo?
Vous pouvez essayer ceci pour voir si les choses accélèrent un peu.
J'ai également multiplié vos valeurs par des pouvoirs de 2 pour les déplacer dans la position appropriée. Les méthodes d'obtention de valeurs de retour de couleur entre 0 et 255 inclus. Le RVB occupe les 24 bits inférieurs sur un int (alpha se trouve dans la plupart des octets de gauche). P>
Tout ce que je vois est une image sombre mais j'ai testé cela avec d'autres paramètres et je sais que cela fonctionne. Le long pôle dans la tente semble lire et écrire les images. J'utilisais un 6637 3787 code> et pourrait lire, modifier et l'écrire en 12 secondes. Pour un traitement plus avancé, vous pouvez vérifier sur
affinetransformop code>. P>
* Cliquez sur le bouton d'un effet. Il est fait 45 secondes plus tard * Pouvez-vous fournir un exemple de reproductible minimal qui démontre ce problème? Est-ce celui de votre question une option viable?
Vous pouvez probablement accélérer les choses. Dans votre exemple, arrêtez d'utiliser
Get / SETRGB CODE> et créez de nouveaux objets code> objets de couleur dans votre boucle. Évitez les arithmétiques du point flottant. Mais la chose la plus importante à faire, fait des choses sur l'EDT (ou "en arrière-plan"), sur un fil séparé. Utilisez un
swingworker code> ou similaire. Cela rendra votre éditeur apparaître i> plus réactif, ce qui est dans de nombreux cas plus important que les performances brutes.