`

Swing 实现截图小软件 (四)

阅读更多

 

接上一节, 我们的截图小软件,功能基本完成,就剩下最后的 水印 功能了。

 

下面就来实现水印功能。

 

所谓图像的水印:就是将要做为水印的文字或图像,覆盖到目标图像(需要被加水印的图像)的指定位置。

 

根据上面解释,可以采用的方案为:

1. 取得 图标图像 的 Image 对象 和 水印图像 的 Image 对象

2. 创建一个缓冲图形对象(BufferedImage) bi

3. 将目标图像画到 bi 中

4. 将水印文字或图像 画到 bi 的指定位置

5. 返回 bi ,bi 即为 加上水印后的图像

 

代码:

/**
     * 给图片添加文字水印
     * @param targetImage 需要加上水印的图片
     * @param text 用做水印的文字
     * @param font 水印文字的字体
     * @param color 水印文字的颜色
     * @param x
     * @param y
     * @return 加上水印后的BufferedImage对象
     */
    public static BufferedImage addImageWaterMark(Image targetImage, String text, Font font, Color color, int x, int y) {
    	int width = targetImage.getWidth(null);
    	int height = targetImage.getHeight(null);
    	
    	BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    	Graphics g = bi.getGraphics();
    	g.drawImage(targetImage, 0, 0, null);
    	g.setFont(font);
    	g.setColor(color);
    	g.drawString(text, x, y);
    	g.dispose();
    	
    	return bi;
    }
    
    /**
     * 给图片添加图片水印
     * @param markImage 用做水印的图片
     * @param targetImage 需要加上水印的图片 
     * @param x 
     * @param y 
     * @return 加上水印后的BufferedImage对象
     */  
    public static BufferedImage addImageWaterMark(Image targetImage, Image markImage, int x, int y) {  
        int wideth = targetImage.getWidth(null);  
        int height = targetImage.getHeight(null);  
        
        BufferedImage  bi = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);  
        Graphics g = bi.createGraphics();  
        g.drawImage(targetImage, 0, 0, null);  
        g.drawImage(markImage, x, y, null);              
        g.dispose();  
       
        return bi; 
    }

 

有了水印方法后,只需在 主程序中加入两个 按钮 调用即可。

部分代码:

textWaterMarkButton.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
		if(imageLabel.getIcon() == null) {
			JOptionPane.showMessageDialog(SnapShoot.this, "没有图片信息,请先截图", "提示", JOptionPane.INFORMATION_MESSAGE);
			return;
		}
		
		//取得imageLabel中的图像
		Image img = ((ImageIcon)imageLabel.getIcon()).getImage();
		
		//添加文字水印
		bi = GraphicsUtils.addImageWaterMark(img, "文字水印", new Font("黑体", Font.BOLD, 30), Color.RED, 50, 50);
		
		//将加好水印的图像,设置到imageLabel
		imageLabel.setIcon(new ImageIcon(bi));
	}
});

imageWaterMarkButton.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
		if(imageLabel.getIcon() == null) {
			JOptionPane.showMessageDialog(SnapShoot.this, "没有图片信息,请先截图", "提示", JOptionPane.INFORMATION_MESSAGE);
			return;
		}
		try {
			//取得imageLabel中的图像
			Image img = ((ImageIcon)imageLabel.getIcon()).getImage();
			
			//取得水印图像
			Image markImage = ImageIO.read(SnapShoot.class.getResourceAsStream("waterMark.gif"));
			
			//添加图像水印
			bi = GraphicsUtils.addImageWaterMark(img, markImage, 100, 100);
			
			//将加好水印的图像,设置到imageLabel
			imageLabel.setIcon(new ImageIcon(bi));
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
});

 

这样图像的水印功能就做好了。如图:


完成代码见附件:SnapShoot1.jar

 

水印功能虽然实现了,但水印的文字和图像,位置都固定了,不能改。那么,接下来,为了水印文字和图像的灵活性,增加一个水印的参数配置对话框。

 

第一步:增加一个JavaBean 作为对话框的返回值

/**
 * 用于水印参数的 JavaBean
 * @author pengranxiang
 */
public class WaterMarkBean {
	private Image image;	//水印图像
	private String text;	//水印文字
	private Font font;		//文字字体
	private Color color;	//文字颜色
	private int x,y;		//水印位置
	//省略 get/set 方法
}

 

第二步:做一个对话框,如图:


图片选择,字体,颜色 需要三个对话框。

文件选择对话框:JFileChooser,颜色选择对话框:JColorChooser, 这两个Sun有提供。

但是 字体选择对话框 就没有了。  以前在网上找到过一个自制的字体对话框, 忘了作者了。。。。

 

就直接拿来用吧。

 

关于缩略图,可以使用

// 关于 该方法的解释 请查看API
bi.getScaledInstance(30, 30, Image.SCALE_FAST)
 

 

增加水印参数设置后的最终效果图:



 
 

到此,我们的截图小软件就告一段落了。  小软件完整代码见附件 SnapShoot.jar

 

附:

 

1. 增加截图时隐藏窗口的效果

 

需要两步完成:

 

a. 将 ScreenWindow 设置为 :总显示在最前面  setAlwaysOnTop(true);   
b. 修改截图按钮监听动作:

snapButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        try {
            //隐藏主窗口
            SnapShoot.this.setVisible(false);
            //防止ScreenWindow生成太快,在主窗口未隐藏前就截图
            Thread.sleep(10);
            //开启模拟屏幕,将显示截图的目标组件传入
            new ScreenWindow(imageLabel);
            //显示主窗口,因为 Screen 显示在最前面,所以在 ScreenWindow 退出之前 看不到主窗口
            SnapShoot.this.setVisible(true);
        } catch (AWTException e1) {
            e1.printStackTrace();
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
    }
});
 

2. 提供将剪切的图片保存到 系统剪贴板 的功能

 

将图片写入系统剪贴板可以使用如下方法:

/**
     * 将指定图片写入系统剪贴板
     * @param image
     */
    public static void setClipboardImage(final Image image) {
    	Transferable trans = new Transferable() {
			public DataFlavor[] getTransferDataFlavors() {
				return new DataFlavor[] { DataFlavor.imageFlavor };
			}

			public boolean isDataFlavorSupported(DataFlavor flavor) {
				return DataFlavor.imageFlavor.equals(flavor);
			}

			public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
				if (isDataFlavorSupported(flavor))
					return image;
				throw new UnsupportedFlavorException(flavor);
			}

		};
		Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);
	}

 

附件:SnapShoot.jar 已经重新上传, 增加了上面的两个附加功能。

  • 大小: 20.6 KB
  • 大小: 6.3 KB
  • 大小: 24.9 KB
  • 大小: 115.8 KB
  • 大小: 27.1 KB
分享到:
评论
13 楼 maplechenda 2011-03-31  
都是直接获取屏幕上的图像点,没考虑过DirectShow程序的问题么,考虑下显存Surface的截图方式。
12 楼 moqinan 2011-03-08  
不错。
可以做一个远程控制的Java Swing应用。
11 楼 pengranxiang 2011-03-02  
sdtm1016 写道
试用了下,不错
另外,最小化后,快捷键无法工作(是不是因为系统屏蔽了软件监听,那么换个如何:shift+print)
任务栏有限,还可不可以最小化到右下角,不用点那个开始,自动监听(这样放到启动栏,开机就启动)?
保存到文件可不可以修改默认目录,默认到桌面(个人习惯,发现好多都这样),这样少点二步,文件自动命名如何?


根据 sdtm1016 兄的建议, 软件已经改进了。 有点点不足,用到 JNI 就无法跨平台了。
请看 http://pengranxiang.iteye.com/blog/938634
10 楼 sdtm1016 2011-03-02  
试用了下,不错
另外,最小化后,快捷键无法工作(是不是因为系统屏蔽了软件监听,那么换个如何:shift+print)
任务栏有限,还可不可以最小化到右下角,不用点那个开始,自动监听(这样放到启动栏,开机就启动)?
保存到文件可不可以修改默认目录,默认到桌面(个人习惯,发现好多都这样),这样少点二步,文件自动命名如何?
9 楼 pengranxiang 2011-03-01  
sdtm1016 写道
非常好,
1.另外可不可以在截图时,直接就保存在剪切板中,不用点那个按钮(对于做测试的人,这会少了很多工作量,尤其是要贴几百个图时到excel时)
2.绑定快捷链,替换掉系统那个,或者自定义个
这二个弄了,就完美了

这两个功能已经加上了。 看这里 http://pengranxiang.iteye.com/admin/blogs/935433
8 楼 superhanliu 2011-02-28  
厉害!继续完善!
截图时隐藏主界面的我试了怎么没有? 另外内存上还是蛮大感觉。
7 楼 sdtm1016 2011-02-28  
非常好,
1.另外可不可以在截图时,直接就保存在剪切板中,不用点那个按钮(对于做测试的人,这会少了很多工作量,尤其是要贴几百个图时到excel时)
2.绑定快捷链,替换掉系统那个,或者自定义个
这二个弄了,就完美了
6 楼 pengranxiang 2011-02-28  
sdtm1016 写道
可以截图时直接复制到剪切板中么?


已经增加 保存到剪贴板的 功能
5 楼 pengranxiang 2011-02-28  
NeighborWolf 写道
和HyperSnap效果差不多了啊。

另外,在截图时应该将软件窗口隐藏掉。


多谢提醒, 已经增加这个效果了。
4 楼 sdtm1016 2011-02-27  
可以截图时直接复制到剪切板中么?
3 楼 NeighborWolf 2011-02-26  
和HyperSnap效果差不多了啊。

另外,在截图时应该将软件窗口隐藏掉。
2 楼 george 2011-02-26  
不错。
可以做一个远程控制的Java Swing应用。
1 楼 gml520 2011-02-26  
这个很不错!

相关推荐

    Swing 实现截图小软件 (五)

    NULL 博文链接:https://pengranxiang.iteye.com/blog/935433

    swing实现的仿qq截图小工具

    本项目是使用Swing实现的一个仿QQ截图小工具,它旨在提供类似QQ截图的功能,让用户在桌面环境中能够方便地进行屏幕截图并进行编辑。 首先,Swing组件库提供了丰富的组件,如JFrame、JButton、JPanel等,这些组件...

    java swing 截屏软件实现

    以下是对这个"java swing 截屏软件实现"的详细知识点解析: 1. **Swing组件**: Swing提供了一套丰富的组件库,如JFrame、JButton、JLabel等,用于构建用户界面。在这个截屏软件中,可能会用到JFrame作为主窗口,...

    java swing 实现的带启动界面的简易截图软件

    java swing 实现的带启动界面的简易截图软件,启动界面有进度条,可保存可粘贴到qq微信,简单实用

    java swing实现pdf阅读器

    总的来说,用Java Swing实现一个PDF阅读器是一个涉及多方面技能的任务,包括对PDF格式的理解、Java GUI编程、IO操作以及第三方库的熟练使用。通过不断学习和实践,可以构建出功能强大且用户友好的PDF阅读器。

    java swing实现学生住宿管理系统(源码)

    java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java ...

    Swing小管理项目源码

    【Swing小管理项目源码】是一个基于Java Swing开发的桌面应用程序示例,它涵盖了多个核心功能,包括用户界面的设计、数据操作以及交互逻辑。Swing是Java的标准库,用于构建图形用户界面(GUI),提供了丰富的组件库...

    使用Java Swing实现了抖音上的表白程序

    最后,作者想说的是,1.9块钱的资源,你买不了吃亏,买不了上当,只需省一片绿箭口香糖的钱,你就能拥有一个用于整蛊的Java Swing实现,你在玩的过程中,还可以初步了解一些Java Swing的知识,如此说来,少年,抓紧时间下载吧。

    javaswing实现贪吃蛇源码

    java贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇...

    Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip

    这个“Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip”文件是一个示例项目,展示了如何利用Swing构建一个基本的多用户聊天应用。下面将详细阐述其涉及的关键知识点。 1. **Swing组件**:Swing提供了丰富的...

    基于Java Swing实现的日历记事本系统【源码+报告文档】

    本项目是一套基于Java Swing实现的日历记事本系统,主要针对计算机相关专业的正在学习java的学生与需要项目实战练习的Java学习者。 包含:项目源码、报告文档等。 项目都经过严格调试,确保可以运行! 该系统功能...

    JAVA Swing 实现商品列表,数量加减 ,删除整行 Demo

    在这个特定的Demo中,我们关注的是如何使用Swing来实现一个商品列表,其中包含商品的数量加减功能以及整行删除的功能。这个功能通常在电商应用或者库存管理软件中会用到。 首先,我们需要了解`JTable`,这是Swing中...

    java swing写的聊天软件

    本项目"java swing写的聊天软件"利用了Swing组件来设计和实现了一个能够支持多达1000个用户同时在线的聊天应用。以下是关于这个聊天软件的关键知识点和实现细节: 1. **Swing组件库**:Swing 提供了丰富的组件,如...

    基于Java swing组件实现简易计算器

    8. Java swing组件的使用:Java swing组件可以用于创建各种图形化用户界面,例如计算器、游戏、聊天软件等。 9. 计算器的实现:计算器是Java swing组件中的一种常见应用,通过使用JFrame、JButton、JPanel、...

    java小游戏 (源码)swing五子棋源代码

    java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...

    Swing写的一个简易记事小软件

    标题中的“Swing写的一个简易记事小软件”指的是使用Java Swing库开发的一款简单应用程序,主要用于记录日常事项。Swing是Java提供的一种图形用户界面(GUI)工具包,它允许开发者创建桌面应用,包括窗口、按钮、...

    java 截屏 swing

    "java 截屏 swing"这个主题涉及到的是如何利用Swing来实现屏幕截图功能。在这个项目中,开发人员创建了一个应用程序,允许用户选择屏幕上的任意矩形区域进行截图,未被选中的部分会显示为阴影效果,同时支持拖动和...

    java swing做的通讯录软件连接sql

    【Java Swing制作的通讯录软件与SQL数据库连接】 在编程领域,Java Swing 是一个用于创建图形用户界面(GUI)的工具包,它提供了丰富的组件和功能,使得开发者能够构建出功能完善的桌面应用。本项目是一个基于Java ...

    Java swing实现的一款餐厅点餐系统

    本项目是一套Java swing实现的一款餐厅点餐系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,...

    java swing mysql实现的酒店管理系统项目源码_swing_JavaSwing_酒店管理系统_

    Java Swing MySQL实现的酒店管理系统项目源码是一款基于Java图形用户界面(GUI)库Swing和关系型数据库管理系统MySQL开发的应用程序。此系统旨在为酒店提供一套全面的后台管理解决方案,涵盖了酒店日常运营中的核心...

Global site tag (gtag.js) - Google Analytics