0
votes

Comment puis-je traiter la mémoire tampon plus rapide

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: xxx pré>

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;
}


2 commentaires

* 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 et créez de nouveaux objets 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 ou similaire. Cela rendra votre éditeur apparaître plus réactif, ce qui est dans de nombreux cas plus important que les performances brutes.


3 Réponses :


0
votes

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.


0 commentaires

0
votes

Je suis d'accord avec @jason - le problème est que vous créez (et détruisez) 15 millions d'objets de couleur.

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.

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 bufferedimage de classe ' getRGB () méthode directement , au lieu de créer un objet de couleur. En outre, vous pouvez utiliser la surcharge de getRGB () 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 () qui prend une matrice de valeurs de pixels.

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.

Pour un plomb sur Obtenir des valeurs R, G et B de l'INT renvoyé par GetRGB (), notez que la documentation de color.getrgb () dit,

"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). "

Une fois que vous avez travaillé, vous pouvez penser à la paralléliser.


1 commentaires

Je ne peux pas comprendre cette fonction surchargée pouvez-vous écrire comme pseudo?



0
votes

Vous pouvez essayer ceci pour voir si les choses accélèrent un peu.

  • Cela utilise un databluffer à partir d'une image raster.
  • et utilise une carte pour conserver les couleurs converties précédentes. Cela peut aider sur une période de temps en fonction du type d'image.
  • et fonctionne avec des doubles car le tampon de données prend en charge différents types.

    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).

    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 et pourrait lire, modifier et l'écrire en 12 secondes. Pour un traitement plus avancé, vous pouvez vérifier sur affinetransformop . xxx


0 commentaires