Je connais la différence d'utilisation de la mémoire entre octets, unsigned short et integer, mais quand il s'agit d'un BufferedImage, y a-t-il une différence de vitesse entre eux?
J'ai utilisé le type d'image dans mon code pour stocker des images, mais j'ai besoin d'une couche alpha. Utiliser BufferedImage me fournit ARGB, mais mon code est/considérablement/plus lent après avoir fait le changement du type Image (et il a seulement été changé pour quelques objets), donc je cherche toutes les améliorations de performance que je peux obtenir.
Je ne suis pas sûr de la stupidité d'une question, alors je vous remercie pour toute réponse.BufferedImage INT/4BYTE/USHORT
2
A
Répondre
2
Tanaki,
j'ai trouvé que, en cas de besoin d'utiliser un canal alpha dans un BufferedImage, le mieux est de Prémultiplier le canal alpha. Par exemple:
// Create an ARGB image BufferedImage bi = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB); Graphics2D g = bi.createGraphics(); // Fill the background (for illustration) g.setColor(Color.black); g.fill(new Rectangle(0, 0, 512, 512)); AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f)); // Keep the original composite Composite original = g.getComposite(); g.setComposite(alpha); // Paint with transparency Rectangle r = new Rectangle(100, 200, 50, 50); g.setColor(Color.magenta); g.fillRect(r); g.setComposite(original); // ... paint further shapes or images as necessary // ... g.dispose(); // Convert to a premultiplied alpha image for fast painting to a Canvas BufferedImage biPre = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB_PRE); Graphics2D gPre = biPre.createGraphics(); gPre.drawImage(bi, 0, 0, null); gPre.dispose(); // clean up: bi.flush(); // Now use biPre for painting to a Canvas, or a Component. // ... // Remember to flush it when done! biPre.flush();
La raison de la peinture d'abord à un TYPE_INT_ARGB est de faire en sorte que tous les alpha se peint comme prévu (non pré-multiplié chaque fois!). Ensuite, lorsque vous avez terminé, peignez toute l'image sur un TYPE_INT_ARGB_PRE, qui est alors en mesure d'amener les données à l'écran avec une bonne vitesse.
+0
Merci beaucoup, cela éclaircit mon problème. – Tanaki
Questions connexes
- 1. BufferedImage Rotation
- 2. Appliquer Bitmask à BufferedImage
- 3. Java BufferedImage/Android Bitmap
- 4. Java - Change BufferedImage File
- 5. Comment lire grand bufferedimage
- 6. Problème de peinture BufferedImage
- 7. Convertir com.lowagie.text.Image en BufferedImage
- 8. rembourrage Java BufferedImage
- 9. BufferedImage dans IKVM
- 10. Java BufferedImage Grayscale Degradation
- 11. BufferedImage - Echelle de gris
- 12. JPanel et BufferedImage
- 13. BufferedImage statique non-statique
- 14. Java BufferedImage fonctionne pas
- 15. Java: BufferedImage à IplImage
- 16. BufferedImage to Bytes Java
- 17. Rotation des instances BufferedImage
- 18. BufferedImage Port Android
- 19. save bufferedimage to gif
- 20. chargement BufferedImage avec ClassLoader.getResource()
- 21. BufferedImage imageType in swing
- 22. Création d'un BufferedImage de .tiff
- 23. Afficher plusieurs BufferedImage en jsp
- 24. Transparence dans les objets bufferedimage
- 25. Calcul rgb vals pour BufferedImage
- 26. Conversion entre InputStream et BufferedImage
- 27. Création d'une image personnalisée BufferedImage
- 28. Java convertir l'image pour BufferedImage
- 29. Difficulté à dessiner dans BufferedImage
- 30. Déplacer BufferedImage avec les touches
Que dit votre profileur? – trashgod
Que voulez-vous dire par le profileur? – Tanaki
['jvisualvm'] (http://download.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html), par exemple. – trashgod