java文字水印模糊_Java添加文字水印和图片水印

文章主要涉及到3个部分

某次需求涉及到给图片添加水印,于是在网上收集了相关的资料,但是还是遇到了很多的坑。

先放上素材图片

d22de76d90e5f70765c5db51e61eb58a.png

e13a1c54a707459d382a7d9ed3965cf3.png

给图片加图片水印

代码

/**

* 为背景图片增加水印图片

*

* @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);

}

效果图

e855c9110488fd2c01dd82f18a196097.png

可以看到图片右上角的小人因为压缩都有点糊了,所以最好使用不要修改图片的尺寸,原来图片有多大就放多大的位置

给图片加文字水印

放上代码

/**

* 添加文字水印的方法

* @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);

}

效果图片

500e246240fa966b7fb105e8e1337eef.png

加水印过程中出现的问题

到现在差不多就可以完成相应的任务了,但是遇到的2个坑有必要说一下

背景泛红

大致的效果就是这样的

3e2d5021eee4d0faca84230a26aa004e.png

看到这个效果,我当时就懵逼了,经过不断地百度和一次次地尝试,终于找到原因了:

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;

}

效果图如下

80734dbd0d960231d388777db2d72cbd.png

好了,就这样吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值