Java 如何将图标从JLabel转换为BuffereImage?

Java 如何将图标从JLabel转换为BuffereImage?,java,image,swing,bufferedimage,jlabel,Java,Image,Swing,Bufferedimage,Jlabel,很简单,非常直截了当,但似乎谷歌叔叔和我都感到困惑 我有一个JLabel,它已经有了自己的图标 如何将从JLabel获取的图标转换为缓冲区图像 有什么办法吗:我试着像这样多选 final BufferedImage bf1 = (BufferedImage)((Image)jll_img.getIcon()); …但失败。您不能将ImageIcon强制转换为Image,因为它不是子类。ImageIcon确实有一个方法getImage(),它返回和Image。看 下面是一些来自Sun论坛的旧代

很简单,非常直截了当,但似乎谷歌叔叔和我都感到困惑

我有一个
JLabel
,它已经有了自己的
图标

如何将从
JLabel
获取的
图标
转换为
缓冲区图像

有什么办法吗:我试着像这样多选

 final BufferedImage bf1 = (BufferedImage)((Image)jll_img.getIcon());

…但失败。

您不能将ImageIcon强制转换为Image,因为它不是子类。ImageIcon确实有一个方法
getImage()
,它返回和Image。看

下面是一些来自Sun论坛的旧代码,用于处理在内存中创建的图像

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);
    }
}
import java.awt.*;
导入java.awt.image.buffereImage;
导入javax.imageio.imageio;
导入java.io.ByteArrayOutputStream;
导入java.util.Random;
导入javax.swing.*;
类ImageCacheTest{
专用JLabel图像标签;
私有尺寸半屏幕尺寸;
私有随机;
专用JProgressBar存储器;
私有字体bigFont=新字体(“Arial”,Font.BOLD,30);
私有整数计数=0;
私有int startMem=0;
私有int maxMem=0;
私有int peakMem=0;
私有int useMem=0;
ImageCacheTest(){
startMem=((int)Runtime.getRuntime().freemory());
maxMem=((int)Runtime.getRuntime().freemory());
peakMem=((int)Runtime.getRuntime().freemory());
JPanel p=新JPanel(新边界布局(4,4));
维度d=Toolkit.getDefaultToolkit().getScreenSize();
半屏幕尺寸=新尺寸(d.宽度/2,d.高度/2);
//半屏幕尺寸=新尺寸(d.宽度-11,d.高度-51);
随机=新随机();
imageLabel=newjlabel(newimageicon(convertToFromBytes(getImage())));
memory=newjprogressbar(0,(int)Runtime.getRuntime().maxMemory());
p、 添加(imageLabel、BorderLayout.CENTER);
p、 添加(内存,BorderLayout.SOUTH);
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setContentPane(p);
f、 设置位置(150150);
f、 包装();
f、 setVisible(真);
Runnable r=新的Runnable(){
@凌驾
公开募捐{
while(true){
试一试{
setIcon(新的ImageIcon(convertToFromBytes(getImage()));
setValue((int)Runtime.getRuntime().freemory());
useMem=((int)Runtime.getRuntime().freemory());
睡眠(30);
}捕获(中断异常例外){
//例外
}最后{
//如果需要的话
}
}
}
};
螺纹t=新螺纹(r);
t、 start();
}
私有缓冲区映像getImage(){
GradientPaint gp=新的GradientPaint(0f,0f,新颜色(127+随机.nextInt(128),127+随机.nextInt(128),127+随机.nextInt(128)),
(float)halfScreenSize.width,(float)halfScreenSize.width,新颜色(random.nextInt(128),random.nextInt(128),random.nextInt(128));
BuffereImage bi=新的BuffereImage(halfScreenSize.width、halfScreenSize.height、BuffereImage.TYPE_INT_RGB);
Graphics2D g2d=bi.createGraphics();
g2d.setPaint(总成);
g2d.fillRect(0,0,半屏幕大小.宽度,半屏幕大小.高度);
g2d.setFont(bigFont);
g2d.setColor(Color.BLACK);
if(maxMem<((int)Runtime.getRuntime().freemory()){
maxMem=((int)Runtime.getRuntime().freemory());
}
if(peakMem>((int)Runtime.getRuntime().freemory()){
peakMem=((int)Runtime.getRuntime().freemory());
}
useMem=((int)Runtime.getRuntime().freemory())-useMem;
g2d.拉丝(“+++计数,20,100);
g2d.drawString(“JVM内存状态-->”,20195);
g2d.drawString(“tot.memory-->”+((int)Runtime.getRuntime().totalMemory()),20240);
g2d.drawString(“最大内存-->”+((int)Runtime.getRuntime().maxMemory()),20270);
g2d.拉丝(“启动时免费--->”+startMem,20300);
g2d.拉丝(“最大可用内存-->”+maxMem,20350);
g2d.拉丝(“最小可用内存-->”+峰值内存,20380);
g2d.drawString(“act free memory-->”+((int)Runtime.getRuntime().freemory()),20410);
g2d.drawString(“内存的使用--->”+useMem,20450);
g2d.dispose();
返回bi;
}
/**不完全确定此方法对于指示“无缓存”是必要的,
但是由于声明是针对字节数组的,所以我们将这样做*/
专用映像转换器字节(BuffereImage映像){
试一试{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
ImageIO.write(图像“png”,baos);
返回Toolkit.getDefaultToolkit().createImage(baos.toByteArray());
}捕获(例外e){
返回null;
}
}
公共静态void main(字符串[]args){
Runnable r=新的Runnable(){
@凌驾
公开募捐{
ImageCacheTest ict=新的ImageCacheTest();
}
};
SwingUtilities.invokeLater(r);
}
}
截图 该代码的屏幕截图,宽度降至¼屏幕宽度


要详细说明@Andrew Thompson的,请注意,实现接口的对象知道如何绘制某些内容,但可能尚未要求它这样做。相比之下,a有一个“可访问的图像数据缓冲区”,程序必须通过调用
paintIcon()
方法来渲染该缓冲区。这是一个相关的方法。

这是最简单的方法:

labelPicture = new JLabel("Picture");
labelPicture.setIcon(new ImageIcon("picture.png"));
.
.
ImageIcon icon = (ImageIcon)labelPicture.getIcon()
BufferedImage img = (BufferedImage)((Image) icon.getImage());

请注意,
JLabel
返回的
图标不一定是
ImageIcon
labelPicture = new JLabel("Picture");
labelPicture.setIcon(new ImageIcon("picture.png"));
.
.
ImageIcon icon = (ImageIcon)labelPicture.getIcon()
BufferedImage img = (BufferedImage)((Image) icon.getImage());