用BufferedImage加载图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用BufferedImage加载图片相关的知识,希望对你有一定的参考价值。

参考技术A BufferedImage是Image的一个子类, BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片,通常用来做图片修改操作如大小变换、图片变灰、设置图片透明或不透明等。

Image是一个抽象列,BufferedImage是Image的实现。Image和BufferedImage的主要作用就是将一副图片加载到内存中。

Java将一副图片加载到内存中的方法是:

String imgPath = "C://demo.jpg";

BufferedImage image = ImageIO.read(new FileInputStream(imgPath));

可以用该方法可以获得图片的详细信息,例如:

获得图片的宽度:image.getWidth(null);图片只有加载内存中才能对图片进行进一步的处理。

接下来画出加载过的图片

当我们要在哪里绘图时,就先获得该对象的Graphics对象的引用,然后调用drawImage的方法。对于BuffereImage对象也是一样的。先在BuffereImage对象中绘图,然后将BuffereImage对象绘制到Frame中。这样就实现了双缓冲。

在paint方法中具体实现如下:

public void paint(Graphics g)

super.paint(g);

bi = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);

Graphics bg = bi.getGraphics(); //在这里获得了bi的Graphics的引用

bg.drawImage(要显示的图片,.....);//调用bg的drawImage方法。

if (fi)

g = img.getGraphics();

g.drawImage(bi, 50, 50, 40, 40, this);



将一些图片添加到 BufferedImage 然后保存

【中文标题】将一些图片添加到 BufferedImage 然后保存【英文标题】:Adding some pictures to a BuffredImage then Save it 【发布时间】:2015-10-20 04:41:49 【问题描述】:

我的总体想法是制作一个 Sprite-Sheet-Maker 我的意思是该程序将:

    收集多张图片,例如“1.bmp”、“2.png”和“3.jpg” 创建新的 BuffredImage 变量并在其上绘制 3 张图片(同时在 JPanel 上绘制 BuffredImage) 保存最终图片“Final.png”

我正在考虑在一个循环中进行第一步和第二步,因为我有一个 JList 包含所有图片的路径。

为此,我在 Eclipse 上使用了 Java 窗口构建器,我制作了表单并尝试在 Panel 上测试一个简单的代码。

Panel panel = new Panel(); //Work
panel.setBackground(Color.BLUE); //Work
BufferedImage img = new BufferedImage(5,5,5); //Work
Graphics g = null ; //Work
panel.paintComponents(g); //work
g.setColor(Color.BLACK); //ERROR---------------------ERROR
g.fillRect(0, 0, 50, 50);

问题不仅在于该代码,而且在于所有想法,所以请您的任何想法都可以帮助我,甚至是我项目的一部分的解决方案的一部分,所以请对任何想法发表评论你有。

【问题讨论】:

【参考方案1】:
 g.setColor(Color.BLACK);//error

自从

  Graphics g = null ;//null value, you are not create any obeject

null 值上,我们无法执行任何操作。

您必须在JPanel 类中覆盖paintComponent 方法,然后您将收到Graphics 对象。

      JPanel panel = new JPanel() 
            @Override
            public void paintComponent(Graphics g) 
                super.paintComponent(g);
                g.setColor(Color.BLUE);
                g.fillRect(0, 0, 100, 100);
            
        ;
        frame.add(panel);//added to frame.

See this link

【讨论】:

好的,如何将“Graphics g”与 JPanel 关联起来?? 你想添加到面板吗? 我希望能够在 jpanel 上画画 覆盖paintComponent 方法。看到那个链接【参考方案2】:
    使用GridLayout 创建一个JPanel。 创建 3 个 JLabel,每个 JLabel 包含每个图像的图标。然后将每个标签添加到面板中。 要创建任何 Swing 组件的图像,您可以使用 Screen Image 类。

【讨论】:

以上是关于用BufferedImage加载图片的主要内容,如果未能解决你的问题,请参考以下文章

在android开发中 为啥没有BufferedImage类?那我把图片转换成二进制怎么办?

BufferedImage操作图片笔记(转)

如何将图标从 JLabel 转换为 BufferedImage?

将一些图片添加到 BufferedImage 然后保存

输出随机认证图片

Java中BufferedImage的用法,如何读取保存一个图片