画图程序,如何将jpanel的内容存为image

Acce8er 2018-03-08 10:22:32
我是java新手,正在用java做一个画图程序。
我用了swing做图形界面,在jpanel里重写了PaintComponent函数来进行绘图。现在正想实现用鼠标作画的功能。

看过其他人的程序源码,有的画图程序是用一个大数组保存了画图时画出来的所有线段、圆等等,然后每次repaint的时候,把数组里所有的东西重新全部绘制一遍。
我发现这个方法有两个问题:
1.每次repaint都要把数组全部重绘一遍,我觉得当内容比较多的时候,这样做很没有效率。
2.当绘制的内容过多,数组填满的时候,就不能再继续画了。

我在这个程序的基础上,打算使用一个缓冲的image来解决以上问题:
每画一会,就将jpanel的内容复制下来,绘制到一个image(或者BufferedImage)上。然后repaint时,先将image上已保存的绘画内容利用drawImage绘制到jpanel上,再进行其他绘制。

但是我卡在了将jpanel的内容生成为image这一步上。我不知道如何完成这一步。
我在网上搜到的方法基本有两个:
1.用Robot的截图功能。这样做速度比较慢,而且很难找到截图区域。
2.将jpanel的画笔交给image,然后怎么在jpanel上画出来的,就怎么在image上重新画一遍。……我就是借用了image才在jpanel上画出完整图像的啊……如果没法把jpanel的图像保存为image,就没办法在jpanel上画了

所以发帖是想请问各位大神,有没有一种办法,可以将JPanel上绘出来的内容保存为Image / BufferedImage?
或者,是否我设计这个程序的思路出现了问题?是否可以有其他的办法来完成这个画图程序的功能?
...全文
634 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Acce8er 2018-03-14
  • 打赏
  • 举报
回复
解决了,最后这个函数我这么写的: public void paintComponent(Graphics g) { super.paintComponent(g); if (buffer == null) { // buffer 是一个BufferedImage,用于缓存已经画好的图像 buffer = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB); // 如果buffer为空,则建立一个图像空间 } Graphics g2 = buffer.getGraphics(); //建立一个Graphics,用于在buffer上画图 //下面这段都是利用Graphics 在buffer上画图 g2.setColor(tool.color); g2.drawLine(tool.prex, tool.prey, tool.x, tool.y); tool.prex = tool.x; tool.prey = tool.y; // g.drawImage(buffer, 0, 0, null); // 最后,将buffer绘制到当前函数的Graphics上 } 实测可用。
kirawinder_159 2018-03-11
  • 打赏
  • 举报
回复
上网看看JAVA的双缓冲绘图适合用不?

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧