Java在JPanel中自由绘图,并将绘图保存为jpg文件

在JPanel中绘图,并利用ImageIO将JPanel保存为图片时,往往只保存一个空白的JPanel,用户所绘制的图形往往不能正确保存,查了很多资料说是要调用paintComponent方法而不是paint方法,但是这里强调的事自由绘图,而不是画好图然后呈现出来。

下面一小段程序是将一个Jpanel保存为图片的正常思路,但在自由绘图时,这个程序只保存一个空白的JPanel。


public boolean savePanelAsJpg(File file, DrawPanel panel) {
    Dimension imageSize = panel.getSize();
    BufferedImage image = new BufferedImage(imageSize.width,imageSize.height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D graphics = image.createGraphics();
    panel.paint(graphics);
    graphics.dispose();
    try {
        ImageIO.write(image, "jpg", file);
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}


要想将用户的自由绘图保存,换一种思路也许很简单,抓屏,没错,Java的一个类Robot提供了抓屏的功能,使用Robot抓屏时可以抓取指定的矩形区域,也可以抓取一个控件,当然是提供控件的坐标位置和大小。下面是Robot的使用方法,直接返回一个BufferedImage对象。

//可以指定要抓取的区域
BufferedImage screencapture = new Robot().createScreenCapture(
	new Rectangle( 15, 15, 150, 150));
		
//可以抓取指定控件:
BufferedImage image = new Robot().createScreenCapture( 
	new Rectangle( jFrame.getX(), jFrame.getY(), jFrame.getWidth(), jFrame.getHeight() ) );

下面是一个使用Jpanel绘图并保存为jpg文件的完整例子。

package cvts;

import java.awt.AWTException;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawSave {

	private JFrame jFrame = null;
	private JPanel jPanel = null;
	
	private String path = System.getProperty("user.dir");
	
	//下侧右侧面板画图时的参数
    private int startX,startY,endX,endY;
	
    public void showGui(){
    	jFrame = new JFrame();
    	jPanel = new JPanel();
    	
    	//设置jPanel大小
    	jPanel.setPreferredSize(new Dimension(400,400));
    	jPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
    	
    	jPanel.addMouseListener(new MouseAdapter(){
            //鼠标按下事件,重置startX,startY
			public void mousePressed(MouseEvent e){
				startX = e.getX();
				startY = e.getY();
			}
			
			//双击面板是保存绘图区
			public void mouseClicked(MouseEvent e){
				if(e.getClickCount() == 2){
					savePic(path+"/pic.jpg");
				}
			}
		}); 

        //鼠标拖动事件,自由画图
    	jPanel.addMouseMotionListener(new MouseAdapter(){
			public void mouseDragged(MouseEvent e){
				Graphics graphics = jPanel.getGraphics();
				endX = e.getX();
				endY = e.getY();
				((Graphics2D) graphics).setColor(new Color(144,242,41));
			        ((Graphics2D) graphics).setStroke(new BasicStroke(10));
				((Graphics2D)graphics).drawLine(startX,startY,endX,endY);
				startX=endX;
				startY=endY;
			}
		});
    	//设置jFrame的位置
    	jFrame.setLocation(400, 200);
    	jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	jFrame.add(jPanel);
        jFrame.pack();
        jFrame.setVisible(true);
    }
    
    public void savePic(String path){
		BufferedImage myImage = null;
		try {
			myImage = new Robot().createScreenCapture(
					new Rectangle(jFrame.getX()+8, jFrame.getY()+30, jPanel.getWidth(), jPanel.getHeight()));
			ImageIO.write(myImage, "jpg", new File(path));
		} catch (AWTException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
    
	public static void main(String[] args) {
		DrawSave drawAndSave = new DrawSave();
		drawAndSave.showGui();
	}

}




  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是用Java代码实现上述功能的一个简单示例: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.File; import javax.imageio.ImageIO; public class ImageEditor extends JFrame implements ActionListener { private JLabel imageLabel; // 用于显示图像的标签 private JPanel canvasPanel; // 用于绘制图形的面板 private JFileChooser fileChooser; // 文件选择器 private File[] imageFiles; // 存储图像文件列表 private int currentImageIndex = 0; // 当前显示的图像在列表的索引 public ImageEditor() { super("图像编辑器"); // 创建图像标签并添加到窗口 imageLabel = new JLabel(); add(imageLabel, BorderLayout.CENTER); // 创建画布面板并添加到窗口 canvasPanel = new JPanel(); canvasPanel.setBackground(Color.WHITE); canvasPanel.setPreferredSize(new Dimension(400, 300)); add(canvasPanel, BorderLayout.SOUTH); // 创建文件选择器并设置文件过滤器 fileChooser = new JFileChooser(); fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() { public boolean accept(File f) { return f.getName().toLowerCase().endsWith(".jpg") || f.getName().toLowerCase().endsWith(".png"); } public String getDescription() { return "JPEG/PNG 图像文件"; } }); // 创建菜单栏并添加菜单项 JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu fileMenu = new JMenu("文件"); menuBar.add(fileMenu); JMenuItem openItem = new JMenuItem("打开"); openItem.addActionListener(this); fileMenu.add(openItem); JMenuItem playItem = new JMenuItem("播放"); playItem.addActionListener(this); fileMenu.add(playItem); // 设置窗口大小并显示 pack(); setVisible(true); } // 处理菜单项事件 public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("打开")) { // 打开文件选择器并获取选文件列表 int result = fileChooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { imageFiles = fileChooser.getSelectedFiles(); currentImageIndex = 0; // 显示第一个图像 displayImage(imageFiles[currentImageIndex]); } } else if (e.getActionCommand().equals("播放")) { // 创建一个定时器,每隔一段时间切换一次图像 Timer timer = new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent e) { currentImageIndex = (currentImageIndex + 1) % imageFiles.length; displayImage(imageFiles[currentImageIndex]); } }); timer.start(); } } // 显示指定的图像 private void displayImage(File file) { try { // 加载图像并设置到标签上 Image image = ImageIO.read(file); imageLabel.setIcon(new ImageIcon(image)); // 绘制图形 Graphics2D g2d = (Graphics2D) canvasPanel.getGraphics(); g2d.setColor(Color.BLUE); g2d.setStroke(new BasicStroke(3.0f)); g2d.drawLine(10, 10, 100, 100); g2d.drawRect(120, 10, 100, 50); g2d.setColor(Color.RED); g2d.fillOval(250, 10, 80, 80); // 添加鼠标事件监听器,用于自由绘图 canvasPanel.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { g2d.setStroke(new BasicStroke(3.0f)); g2d.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); } public void mouseDragged(MouseEvent e) { g2d.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); } }); canvasPanel.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { g2d.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); } }); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "无法加载图像文件: " + ex.getMessage()); } } public static void main(String[] args) { new ImageEditor(); } } ``` 这个程序使用了Swing组件来实现图像显示和绘图功能,通过文件选择器选择图像文件后,可以在图像上进行旋转等变换,并在画布区域上进行各种规则图形的绘制,还可以通过鼠标的拖动自由绘图。同时还提供了连续播放所选文件夹下的所有图像的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值