目录

  • 文章主要涉及到3个部分
  • 给图片加图片水印
  • 给图片加文字水印
  • 加水印过程中出现的问题
  • 背景泛红
  • 文字有锯齿状印记

文章主要涉及到3个部分

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

先放上素材图片

java 删掉ip java 删掉水印文字_ide


java 删掉ip java 删掉水印文字_API_02

给图片加图片水印

代码

/**
 * 为背景图片增加水印图片
 *
 * @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);
}

效果图

java 删掉ip java 删掉水印文字_ide_03

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

给图片加文字水印

放上代码

/**
 * 添加文字水印的方法
 * @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);
}

效果图片

java 删掉ip java 删掉水印文字_Image_04

加水印过程中出现的问题

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

背景泛红

java 删掉ip java 删掉水印文字_Java_05

java 删掉ip java 删掉水印文字_java 删掉ip_06

大致的效果就是这样的

java 删掉ip java 删掉水印文字_ide_07

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

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 删掉ip java 删掉水印文字_java 删掉ip_08

好了,就这样吧!