首页 / JAVA / Java添加文字水印和图片水印
Java添加文字水印和图片水印
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java添加文字水印和图片水印,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5304字,纯文字阅读大概需要8分钟。
内容图文
![Java添加文字水印和图片水印](/upload/InfoBanner/zyjiaocheng/631/ea208e54e6c042c1933c4414f89c7343.jpg)
目录
文章主要涉及到3个部分
某次需求涉及到给图片添加水印,于是在网上收集了相关的资料,但是还是遇到了很多的坑。
先放上素材图片
给图片加图片水印
代码
/**
* 为背景图片增加水印图片
*
* @param path 水印图片,本地地址,未做网络图片转换
* @param bgPath 背景图片,同上
* @param x 横坐标,左上角0,往右递增
* @param y 纵坐标,左上角0,往下递增
* @param width 水印图片宽度
* @param height 水印图片高度
* @return
*/
public static byte[] generateImage(String path,String bgPath , int x, int y, int width, int height) {
try {
BufferedImage watermarkImage = ImageIO.read(new File(path));
BufferedImage bgImage = ImageIO.read(new File(bgPath));
int bgWidth = bgImage.getWidth(null);
int bgHeight = bgImage.getHeight(null);
BufferedImage image = new BufferedImage(bgWidth, bgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(bgImage, 0, 0, bgWidth, bgHeight, null);
width = width == 0 ? watermarkImage.getWidth() : width;
height = height == 0 ? watermarkImage.getHeight() : height;
g.drawImage(watermarkImage, x, y, width, height, null);
g.dispose();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", out);
return out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将字节数组转换为本地图片
* @param data
* @param path
*/
public static void byte2image(byte[] data, String path) {
if (data.length < 3 || path.equals("")){
return;
}
try {
FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
imageOutput.write(data, 0, data.length);
imageOutput.close();
System.out.println("生成图片成功:" + path);
} catch (Exception ex) {
ex.printStackTrace();
}
}
测试
public static void main(String[] args) {
String path = "F://sdyg.jpg";
String waterPath = "F://small.png";
String imgResult = "F://img.png";
byte[] bytes = generateImage(waterPath,path, 250, 10, 80, 100);
byte2image(bytes,imgResult);
}
效果图
可以看到图片右上角的小人因为压缩都有点糊了,所以最好使用不要修改图片的尺寸,原来图片有多大就放多大的位置
给图片加文字水印
放上代码
/**
* 添加文字水印的方法
* @param pressText 要添加的文字
* @param path 文件路径,这里只处理了了本地文件,未处理网络图片
* @param x 文字在图片的横坐标,左上角为0,往右递增
* @param y 文字在图片的纵坐标,左上角为0,往下递增
* @param fontName 文字的字体名称
* @param fontSize 文字的大小
* @param fontColor 文字的眼神
* @param style 文字的格式,如Font.BOLD++Font.ITALIC表示粗体斜体
* @return
*/
private static byte[] generateText(String pressText, String path, int x, int y, String fontName,
int fontSize, Color fontColor, int style){
try {
BufferedImage bgImage= ImageIO.read(new File(path));
int wideth = bgImage.getWidth(null);
int height = bgImage.getHeight(null);
BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
g.drawImage(bgImage, 0, 0, wideth, height, null);
//设置字体大小、颜色等
g.setColor(fontColor);
g.setFont(new Font(fontName, style, fontSize));
g.drawString(pressText, x, y);
g.dispose();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", out);
return out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
测试
public static void main(String[] args) {
String path = "F://sdyg.jpg";
String path2 = "F://text.png";
//Font.BOLD+Font.ITALIC表示加粗且斜体
byte[] bytes = generateText("圣地亚哥", path, 210, 50, "微软雅黑", 30, Color.RED, Font.BOLD+Font.ITALIC);
byte2image(bytes,path2);
}
效果图片
加水印过程中出现的问题
到现在差不多就可以完成相应的任务了,但是遇到的2个坑有必要说一下
背景泛红
大致的效果就是这样的
看到这个效果,我当时就懵逼了,经过不断地百度和一次次地尝试,终于找到原因了:
BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_ARGB);
//之前的代码里面生成BufferedImage对象的时候传的是TYPE_INT_ARGB这个常量,改成下面的TYPE_INT_RGB就好了
BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);
文字有锯齿状印记
至于这个问题,从上面的效果图中也可以看出来,那几个水印文字笔画中已经出现锯齿状,解决这个问题,需要在加文字水印之前对Graphics2D对象进行一些操作,具体是什么操作我也看不懂,反正加上就好了
private static byte[] generateText(String pressText, String path, int x, int y, String fontName,
int fontSize, Color fontColor, int style) {
try {
BufferedImage bgImage = ImageIO.read(new File(path));
int wideth = bgImage.getWidth(null);
int height = bgImage.getHeight(null);
BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
g.drawImage(bgImage, 0, 0, wideth, height, null);
g.setColor(fontColor);
g.setFont(new Font(fontName, style, fontSize));
//不加的话文字水印有锯齿
RenderingHints rh=new RenderingHints(RenderingHints. KEY_ANTIALIASING,
RenderingHints. VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_STROKE_CONTROL
, RenderingHints.VALUE_STROKE_PURE);
rh.put(RenderingHints.KEY_ALPHA_INTERPOLATION
, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g.setRenderingHints(rh);
//添加文字水印
g.drawString(pressText, x, y);
g.dispose();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", out);
return out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
效果图如下
好了,就这样吧!
内容总结
以上是互联网集市为您收集整理的Java添加文字水印和图片水印全部内容,希望文章能够帮你解决Java添加文字水印和图片水印所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。