接上一节, 我们的截图小软件,功能基本完成,就剩下最后的 水印
功能了。
下面就来实现水印功能。
所谓图像的水印:就是将要做为水印的文字或图像,覆盖到目标图像(需要被加水印的图像)的指定位置。
根据上面解释,可以采用的方案为:
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
分享到:
相关推荐
NULL 博文链接:https://pengranxiang.iteye.com/blog/935433
java swing 截屏软件实现,下载文件导入eclipse即可,可运行。
swing实现的仿qq截图小工具 功能比较完善 项目可直接导入Eclipse中 也可直接运行jar包查看效果
java swing 实现的带启动界面的简易截图软件,启动界面有进度条,可保存可粘贴到qq微信,简单实用
java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java swing实现学生住宿管理系统(源码) java ...
java贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇javaswing实现贪吃蛇...
Java基于Swing实现的简单聊天室,支持多人在线闲谈.zip
java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...
本项目是一套Java swing实现的一款餐厅点餐系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试,...
java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing mysql实现的酒店管理系统项目源码.zip java swing ...
这个java项目是一个基于数据库的简单jdbc项目,只要在自己数据库中建立相应的表就可以实现操作。比较简单,可以帮助大家学习.
使用java swing和开源jar包jgraph完成的故障分析树软件。包含可执行jar文件,源代码,以及说明文档和演示的PPT,视频。 图形界面美观,自动由公式生成树形结构,也可以用鼠标增删改。支持图形和公式编辑以及切换。
基于java swing实现的贪吃蛇小游戏源码+可执行的jar文件
最后,作者想说的是,1.9块钱的资源,你买不了吃亏,买不了上当,只需省一片绿箭口香糖的钱,你就能拥有一个用于整蛊的Java Swing实现,你在玩的过程中,还可以初步了解一些Java Swing的知识,如此说来,少年,抓紧时间下载吧。
本项目是一套基于Java swing和mysql实现的银行管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。...
自己做的通讯录,主要是练习的,对初学者有用 导入工程之后要重新添加sqljdbc驱动,数据库没有给出,不过有创建数据库的语句了 采用布局管理,图片是直接存入数据库的(建议不用这个方法)
基于java的QQ截屏工具的设计和实现能够实现对屏幕的随机截取,复制,保存以及添加文字等操作,便于用户对数据的处理。 该软件的功能: (1)随机获取屏幕指定区域; (2)编辑(添加文字)截图; (3)存储...
这款Java swing实现的学生信息管理系统和jsp版本的功能很相似,简单的实现了班级信息的增删改查,学生信息的增删改查,数据库采用的是mysql,jdk版本不限,是Java学习者学习参考非常好的一个小项目,下面我们来看看...
使用java swing技术实现的考勤工时计算工具,是有人找我专门定制的,通过ecxel报表上送考勤记录后再进行计算,数据存储使用的是sqllite
用于swing学习,入门专用。实现了多线程通讯和私聊。