2010-03-02 3 views
9

J'ai un BufferedImage transparent créé avec le code suivant (pas pertinent comment il est créé, je pense):Effacer Un BufferedImage transparent aussi vite que possible

  GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      GraphicsDevice gs = ge.getDefaultScreenDevice(); 
      GraphicsConfiguration gc = gs.getDefaultConfiguration(); 

      Rectangle screen = transformationContext.getScreen(); 

      // Create an image that supports transparent pixels 
      return gc.createCompatibleImage((int) screen.getWidth(), (int) screen.getHeight(), 
        Transparency.BITMASK); 

Comment effacer l'image (l'image vide le même état qu'il a été créé) de la manière la plus rapide possible sans recréer l'image? Recréer l'image fait peser un fardeau sur GC, interrompant la machine virtuelle et gelant l'interface utilisateur.

Répondre

16

Got it :) utilisé clearRect au lieu de remplir avec une couleur transparente.

  graphics = (Graphics2D) offlineBuffer.getGraphics(); 
      graphics.setBackground(new Color(255, 255, 255, 0)); 
      Rectangle screen = transformationContext.getScreen(); 
      graphics.clearRect(0,0, (int)screen.getWidth(), (int)screen.getHeight()); 
+4

'clearRect' est dit être obsolète depuis 1.1 bien qu'il ne soit pas étiqueté comme tel (peut-être parce que les annotations n'existaient pas encore?). La méthode préférée est maintenant: 'graphics.setComposite (AlphaComposite.Clear); graphics.fillRect (0, 0, TAILLE, TAILLE); graphics.setComposite (AlphaComposite.SrcOver); '(en supposant que SrcOver était le composite que vous utilisiez avant, et est le paramètre par défaut). Ceci est en fait proche de l'implémentation de' clearRect'. –

+0

il n'y a pas d'étiquette de dépréciation dans le doc java, donc je présume qu'il est toujours valide –

+0

@ adrian.tarau c'est à quoi il fait référence; annotations. Les javadocs sont générés automatiquement; puisque l'annotation '@ Deprecated' ne figure pas dans le code (elle n'existait pas encore) alors elle n'était pas dans les javadocs. – Qix

9

Un moyen relativement rapide, mais je ne sais pas si c'est le plus rapide (et j'aimerais voir d'autres réponses) est d'avoir une autre image que vous ne modifiez jamais et qui est toujours "entièrement effacée"/"entièrement" transparent » et vous faites une copie de trame, dites que vous avez nommé cette copie claire:

imageYouWantToClear.setData(CLEAR.getRaster()); 

Notez que le travail avec des graphiques peut être très difficile en matière de performances, car il y a beaucoup de non-très-bien comportement documenté. Par exemple vos images (disons le CLEAR) peuvent être accélérées matériellement mais vous perdriez alors l'accélération matérielle dès que vous utiliseriez une méthode de mutation (comme par exemple un setRgb()) et il s'avérerait très difficile à réaliser que vous venez de perdre le bénéfice de l'accélération matérielle.

Je pense que le meilleur endroit pour trouver des informations sur le sujet de BufferedImage performant serait dans les programmeurs de jeux Java et les communautés/forums de jeu-API-programmeurs Java.

faire Btw vous que votre BufferedImage utilisent le mode « compatible »: TYPE_INT_ARGB peut être très bien sur Windows, mais pas sur OS X, etc. si vous voulez les créer faire quelque chose comme:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); 

Ouch la Loi-de-Demeter fait mal, merci Java;)

+0

Merci WizardOfOdds mais en gardant une autre image (qui doit être recréée lorsque l'image « active » est recréée parce que les limites changent) augmentera l'utilisation de la mémoire (pensez 1600x1200 résolution d'écran). clearRect fait le tour et ça semble assez rapide. –

Questions connexes