simple, très simple en avant, mais semble être google et moi d'être confus.
J'ai un seul y a-t-il un moyen de: i essayé de multiples .. mais il a échoué. P> P> jlabel code> qui a déjà son propre icône p> < p> Comment convertir l'icône code> obtenu à partir de jlabel code> dans un bufferedImage code>? p>
4 Réponses :
Vous ne pouvez pas jeter imageicon à l'image car ce n'est pas une sous-classe. Imageicon a une méthode getImage () code> qui retourne et image, cependant. Voir ici P>
Notez que l'icône code> renvoyée par un jlabel code> n'est pas nécessairement un imageicon code>, et icône code> n'a pas de getImage () code> méthode. En outre, l'image code> retournée de imageicon.getimage () code> n'est pas garantie d'être un bufferedimage code>. Il est plus sûr d'utiliser l'approche décrite dans ma réponse.
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.ByteArrayOutputStream;
import java.util.Random;
import javax.swing.*;
class ImageCacheTest {
private JLabel imageLabel;
private Dimension halfScreenSize;
private Random random;
private JProgressBar memory;
private Font bigFont = new Font("Arial", Font.BOLD, 30);
private int count = 0;
private int startMem = 0;
private int maxMem = 0;
private int peakMem = 0;
private int useMem = 0;
ImageCacheTest() {
startMem = ((int) Runtime.getRuntime().freeMemory());
maxMem = ((int) Runtime.getRuntime().freeMemory());
peakMem = ((int) Runtime.getRuntime().freeMemory());
JPanel p = new JPanel(new BorderLayout(4, 4));
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
halfScreenSize = new Dimension(d.width / 2, d.height / 2);
//halfScreenSize = new Dimension(d.width - 11, d.height - 51);
random = new Random();
imageLabel = new JLabel(new ImageIcon(convertToFromBytes(getImage())));
memory = new JProgressBar(0, (int) Runtime.getRuntime().maxMemory());
p.add(imageLabel, BorderLayout.CENTER);
p.add(memory, BorderLayout.SOUTH);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(p);
f.setLocation(150, 150);
f.pack();
f.setVisible(true);
Runnable r = new Runnable() {
@Override
public void run() {
while (true) {
try {
imageLabel.setIcon(new ImageIcon(convertToFromBytes(getImage())));
memory.setValue((int) Runtime.getRuntime().freeMemory());
useMem = ((int) Runtime.getRuntime().freeMemory());
Thread.sleep(30);
} catch (InterruptedException ex) {
//something exceptio
}finally{
// alive that if required
}
}
}
};
Thread t = new Thread(r);
t.start();
}
private BufferedImage getImage() {
GradientPaint gp = new GradientPaint(0f, 0f, new Color(127 + random.nextInt(128), 127 + random.nextInt(128), 127 + random.nextInt(128)),
(float) halfScreenSize.width, (float) halfScreenSize.width, new Color(random.nextInt(128), random.nextInt(128), random.nextInt(128)));
BufferedImage bi = new BufferedImage(halfScreenSize.width, halfScreenSize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = bi.createGraphics();
g2d.setPaint(gp);
g2d.fillRect(0, 0, halfScreenSize.width, halfScreenSize.height);
g2d.setFont(bigFont);
g2d.setColor(Color.BLACK);
if (maxMem < ((int) Runtime.getRuntime().freeMemory())) {
maxMem = ((int) Runtime.getRuntime().freeMemory());
}
if (peakMem > ((int) Runtime.getRuntime().freeMemory())) {
peakMem = ((int) Runtime.getRuntime().freeMemory());
}
useMem = ((int) Runtime.getRuntime().freeMemory()) - useMem;
g2d.drawString("" + ++count, 20, 100);
g2d.drawString("JVM memory status ---> ", 20, 195);
g2d.drawString("tot. memory ---> " + ((int) Runtime.getRuntime().totalMemory()), 20, 240);
g2d.drawString("max. memory ---> " + ((int) Runtime.getRuntime().maxMemory()), 20, 270);
g2d.drawString("free on startUp ---> " + startMem, 20, 300);
g2d.drawString("max free memory ---> " + maxMem, 20, 350);
g2d.drawString("min free memory ---> " + peakMem, 20, 380);
g2d.drawString("act free memory ---> " + ((int) Runtime.getRuntime().freeMemory()), 20, 410);
g2d.drawString("usage of memory ---> " + useMem, 20, 450);
g2d.dispose();
return bi;
}
/** Not entirely sure this method is necessary for indicating 'no cache',
but since the claim was specific to byte arrays, we'll do it. */
private Image convertToFromBytes(BufferedImage image) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "png", baos);
return Toolkit.getDefaultToolkit().createImage(baos.toByteArray());
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
ImageCacheTest ict = new ImageCacheTest();
}
};
SwingUtilities.invokeLater(r);
}
}
@Andrew Thompson :-) Comme je l'ai dit quoi que ce soit, revenez à votre code, vous pouvez ajouter votre code gobel's-edge à votre message, puis je supprimerai mon message de ce fil, avec mon respect
@MKorbel: "Vous pouvez ajouter votre code gobel's-edge à votre message". Terminé. Aimez cette expression BTW - Beats 'Couper Edge'. ;)
@Andrew thompson phhhhhhhhaaa mieux comme je ..., c'est correct, merci
+1 bons exemples. Ne négligez pas Dispose () Code> Les instances graphiques renvoyées par Creategraphics () Code>.
amplifier sur @andrew thompson's Réponse A>, Notez qu'un objet qui implémente le L'icône code> interface sait peindre quelque chose, mais il se peut qu'il n'aurait peut-être pas été invité à le faire pour le moment. En revanche, un Bufferedimage a "Un tampon accessible de données d'image" que votre programme doit rendre en appelant la méthode peinture () code>. Voici un exemple . P>
Ceci est le moyen le plus simple:
labelPicture = new JLabel("Picture");
labelPicture.setIcon(new ImageIcon("picture.png"));
.
.
ImageIcon icon = (ImageIcon)labelPicture.getIcon()
BufferedImage img = (BufferedImage)((Image) icon.getImage());