java实现图片加水印问题

攻城尸 2014-11-07 10:25:43
目前已经可以实现java对图片进行水印处理,但是问题是,我需要绘制的水印不止一个,位置也是不一样的,如何实现在同一张图片上面绘制多个不同位置的水印,跪谢,感激不尽。
...全文
830 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_34721505 2017-02-28
  • 打赏
  • 举报
回复
是不是少发布了一个类:BillDetailImagePosition,程序报错
woTMbushixiaobai 2016-10-21
  • 打赏
  • 举报
回复
你好,我给图片加水印为啥乱码,显示的是小方框
qq_32710281 2016-05-30
  • 打赏
  • 举报
回复
我也想问BillDetailImagePosition.getPosition("888880002302900")是什么
softcm 2016-04-08
  • 打赏
  • 举报
回复
请问 BillDetailImagePosition.getPosition("888880002302900") 是哪个类中
攻城尸 2014-11-07
  • 打赏
  • 举报
回复
真心的感谢你帮我的忙,1楼已经只出了我的错误,由于我的分数有限,所以每人都给了一点,再次谢谢。
svenwang 2014-11-07
  • 打赏
  • 举报
回复
引用 4 楼 liubihang 的回复:
你也看到了,我循环那个方法打,但是会把前面的给覆盖,最后只有一个水印,我也很苦恼
那你检查一下BillDetailImagePosition.getPosition("888880002302900")这个函数返回的位置是不是都是一样的。
攻城尸 2014-11-07
  • 打赏
  • 举报
回复
哈哈哈哈哈,太谢谢你啦,可以啦,看来是代码的顺序问题,非常感谢你这么晚了还抽空观看我的代码和问题,真实太谢谢了,也感谢今天所有回复我的人,感谢大家
Kifile 2014-11-07
  • 打赏
  • 举报
回复
g.drawImage( srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); 这一句只执行一次不就好了
Kifile 2014-11-07
  • 打赏
  • 举报
回复
Graphics2D g = buffImg.createGraphics(); // 3、设置对线段的锯齿状边缘处理 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage( srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); // 5、设置水印文字颜色 g.setColor(color); // 6、设置水印文字Font g.setFont(font); // 7、设置水印文字透明度 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) g.drawString(logoText, positionX, PositionY); // 9、释放资源 g.dispose();, 你这里每一次都重新绘制了图片,把之前绘制的部分覆盖了
攻城尸 2014-11-07
  • 打赏
  • 举报
回复
程序没有报错,只是没有按照我规定实现多个水印的绘制,绘制多个最终都会把前面的都覆盖掉,最终还是只有一个水印,你可以拷贝代码试试
还在加载中灬 2014-11-07
  • 打赏
  • 举报
回复
嗯,不明白,是出错了吗?还是怎么呢? 一个水印可以的话,获取相同句柄再在不同位置再加一个也可以的~~
攻城尸 2014-11-07
  • 打赏
  • 举报
回复
你也看到了,我循环那个方法打,但是会把前面的给覆盖,最后只有一个水印,我也很苦恼
svenwang 2014-11-07
  • 打赏
  • 举报
回复
既然打一个水印可以,那么多打几次不就满足你的需求了?
攻城尸 2014-11-07
  • 打赏
  • 举报
回复
/** 
 * Copyright (c) 2003-2007 Wonders Information Co.,Ltd. All Rights Reserved.
 * 5-6/F, 20 Bldg, 481 Guiping RD. Shanghai 200233,PRC
 *
 * This software is the confidential and proprietary information of Wonders Group.
 * (Research & Development Center). You shall not disclose such
 * Confidential Information and shall use it only in accordance with 
 * the terms of the license agreement you entered into with Wonders Group. 
 *
 * Distributable under GNU LGPL license by gun.org
 */
package com.wonders.cop.billing.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.imageio.ImageIO;

/**
 * TODO(用一句话描述该文件做什么)
 * 
 * @Title: ImageMarkLogUtil.java
 * @Package com.wonders.cop.billing.util
 * @ClassName: ImageMarkLogUtil
 * @author YaoHang
 * @company Wonders Information Co.,Ltd.
 * @date 2014年11月6日 下午4:24:35
 * @version V1.0
 */
public class ImageMarkLogoUtil {
	// 水印透明度
	private static float alpha = 1f;
	// 水印横向位置
	private static int positionWidth = 82;
	// 水印纵向位置
	private static int positionHeight = 545;
	// 水印文字字体
	private static Font font = new Font("宋体", Font.PLAIN, 13);
	// 水印文字颜色
	private static Color color = Color.black;

	public static void main(String[] args) {
		String srcImgPath = "d:/888880002302900_web.jpg";
		String targerTextPath = "d:/qie_text.jpg";
		ImageMarkLogoUtil
				.markImageByTexts(testValue(),
						BillDetailImagePosition.getPosition("888880002302900"), srcImgPath,
						targerTextPath);
	}

	public static Map testValue() {
		Map<String, String> value = new HashMap<String, String>();
		value.put("feedPrice", "15.1");
		value.put("feedCount", "20");
		value.put("nowNum", "124");
		value.put("drainageCount", "55");
		value.put("drainagePrice", "1.5");
		value.put("feedCost", "66");
		value.put("cost", "66");
		value.put("drainageCost", "100");
		value.put("barcode", "10101010101010101");
		value.put("nextCopy", "2014-12-10");
		value.put("waterType", "居民生活用水");
		value.put("meterReader", "测试人员");
		value.put("copyNumber", "741sg");
		value.put("prevCarryOver", "0.25");
		value.put("nowCarryOver", "2.12");
		value.put("openDate", "20141002");
		value.put("nextMonth", "201402 ");
		value.put("remark", "您缴付的2013年03月30.80元水费,我公司已收到,谢谢!");
		value.put("detailStatus", "00");
		value.put("billStatus", "00");
		value.put("prevMonth", "201406");
		value.put("lastPayDate", "20140112");
		value.put("companyName", "市北水");
		value.put("type", "1");
		value.put("amount", "58.1");
		value.put("address", "浦秀路220弄10号101");
		value.put("year","2014");
		value.put("month", "04");
		value.put("billId", "11111");
		value.put("account", "38445450");
		value.put("companyId", "888880002302900");
		value.put("realName", "姚航");
		return value;
	}

	/**
	 * 给图片添加水印文字、可设置水印文字的旋转角度
	 * 
	 * @param logoText
	 * @param srcImgPath
	 * @param targerPath
	 * @param degree
	 */
	public static void markImageByTexts(Map<String, String> value,
			Map<String, String[]> position, String srcImgPath, String targerPath) {

		InputStream is = null;
		OutputStream os = null;
		try {
			// 1、源图片
			Image srcImg = ImageIO.read(new File(srcImgPath));
			BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
					srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
			// 2、得到画笔对象
			
			Iterator<String> positionIter = position.keySet().iterator();
			String key = "";
			String logotext = "";
			String[] xy;
			while (positionIter.hasNext()) {
				key = positionIter.next();
				xy = position.get(key);
				logotext = value.get(key);
				System.out.println("key:"+key+",value:"+logotext);
				if (xy != null && xy.length == 2)
					printText(srcImg, buffImg, logotext,
							Integer.valueOf(xy[0]), Integer.valueOf(xy[1]));
			}
			// 10、生成图片
			os = new FileOutputStream(targerPath);
			ImageIO.write(buffImg, "JPG", os);

			System.out.println("图片完成添加水印文字");

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != is)
					is.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if (null != os)
					os.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 在图片上打印文字
	 * 
	 * @param srcImg
	 * @param buffImg
	 * @param logoText
	 * @return
	 */
	private static void printText(Image srcImg, BufferedImage buffImg,
			String logoText, Integer positionX, Integer PositionY) {
		Graphics2D g = buffImg.createGraphics();
		// 3、设置对线段的锯齿状边缘处理
		g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g.drawImage(
				srcImg.getScaledInstance(srcImg.getWidth(null),
						srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
		// 5、设置水印文字颜色
		g.setColor(color);
		// 6、设置水印文字Font
		g.setFont(font);
		// 7、设置水印文字透明度
		g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
				alpha));
		// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
		g.drawString(logoText, positionX, PositionY);
		// 9、释放资源
		g.dispose();
	}
}
Kifile 2014-11-07
  • 打赏
  • 举报
回复
代码呢,发出来看看,没有代码,怎么能看出问题呢

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧