`
ater
  • 浏览: 49756 次
  • 性别: Icon_minigender_1
  • 来自: 福州
文章分类
社区版块
存档分类
最新评论

java实现图片水印的添加

阅读更多

package com.cari.image;
/**
 * 
 */

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.*;
import com.sun.image.codec.jpeg.*;

/**
 * @author zsy
 * 
 */

public class WaterMark {
	private static List logoImgs;
	private static List bgImgs ;
	private static float logoPosition = 1f;
	private static float logoSrcOver = 0.4f;
	private static float bgSrcOver = 0.3f;
	
	private static boolean flag;//为true时生成背景水印,为false时生成图标水印
	
	public static List getBgImgs() {
		return bgImgs;
	}

	/**
	 * 设置背景水印图片的路径并把图片加载到内存
	 * @param bgImgUrls
	 * @param path
	 */
	public static void setBgImgs(List bgImgUrls, String path) {
		bgImgs = new ArrayList();
		for (Iterator it = bgImgUrls.iterator(); it.hasNext(); ) {
			String tem = (String)it.next();
			ImageIcon waterIcon = new ImageIcon(path + tem);
			bgImgs.add(waterIcon.getImage());
		}
	}

	public static List getLogoImgs() {
		return logoImgs;
	}

	/**
	 * 设置图标水印图片的路径并把图片加载到内存
	 * @param logoImgUrls
	 * @param path
	 */
	public static void setLogoImgs(List logoImgUrls, String path) {
		logoImgs = new ArrayList();
		for (Iterator it = logoImgUrls.iterator(); it.hasNext(); ) {
			String tem = (String)it.next();
			ImageIcon waterIcon = new ImageIcon(path + tem);
			logoImgs.add(waterIcon.getImage());
		}
	}

	public static float getLogoPosition() {
		return logoPosition;
	}

	public static void setLogoPosition(float logoPosition) {
		WaterMark.logoPosition = logoPosition;
	}

	public static float getBgSrcOver() {
		return bgSrcOver;
	}

	public static void setBgSrcOver(float bgSrcOver) {
		WaterMark.bgSrcOver = bgSrcOver;
	}

	public static float getLogoSrcOver() {
		return logoSrcOver;
	}

	public static void setLogoSrcOver(float logoSrcOver) {
		WaterMark.logoSrcOver = logoSrcOver;
	}

	/**
	 * 图片中添加图标水印并输出到指定流
	 * @param data
	 * @param out
	 * @param channel
	 * @return
	 * @throws Exception
	 */
	public static boolean createLogoMark(byte[] data, 
			FileOutputStream out, String channel) throws Exception {
		int i = (int)(logoImgs.size() * Math.random());
		return createMark(data, out, (Image)logoImgs.get(i), true);
	}
	
	/**
	 * 图片中添加背景水印并输出到指定流
	 * @param data
	 * @param out
	 * @param channelName
	 * @return
	 * @throws Exception
	 */
	public static boolean createBgMark(byte[] data, 
			FileOutputStream out, String channelName) throws Exception {
		int i = (int)(bgImgs.size() * Math.random());
		return createMark(data, out, (Image)bgImgs.get(i), false);
	}
	
	/**
	 * 生成随机水印并输出到指定流
	 * @param data
	 * @param out
	 * @return
	 * @throws Exception
	 */
	public static boolean createRandomMark(byte[] data, 
			FileOutputStream out) throws Exception {
		int i = 0;
		Image temImg = null;
		int logoSize = logoImgs.size();
		int bgSize = bgImgs.size();
		if (logoSize <= 0 && bgSize <= 0) {
			return createMark(data, out, temImg, flag);
		}
		if (logoSize <= 0) {
			flag = true;
		} else if (bgSize <= 0) {
			flag = false;
		}
		if (!flag) {
			i = (int)(logoImgs.size() * Math.random());
			temImg = (Image)logoImgs.get(i);
		} else {
			i = (int)(bgImgs.size() * Math.random());
			temImg = (Image)bgImgs.get(i);
		} 
		flag = !flag;
		return createMark(data, out, temImg, flag);
	}
	
	/**
	 * 生成水印并输出到指定流
	 * @param data 图片的二进制数据
	 * @param out 处理后图片的输出流
	 * @param waterImg 水印图片的类型(背景或图标),应与isLogoImg参数一致,如果为空不加水印
	 * @param isLogoImg 等于true 时生成图标水印,否则为背景水印
	 * @return
	 * @throws Exception
	 */
	private static boolean createMark(byte[] data, FileOutputStream out, 
			Image waterImg ,boolean isLogoImg) throws Exception {
		ImageIcon imgIcon = new ImageIcon(data);
		Image theImg = imgIcon.getImage();

		int width = theImg.getWidth(null);
		int height = theImg.getHeight(null);
		int w = waterImg == null ? 0 : waterImg.getWidth(null);
		int h = waterImg == null ? 0 : waterImg.getHeight(null);
		if (w == 0 || h == 0 || width <= w || height <= h) {//小图片不加水印真接输入,如头像图片
			BufferedOutputStream fout = null;
			ByteArrayInputStream in = new ByteArrayInputStream(data);
			try {
				byte[] b = new byte[1024*10];
	        	fout = new BufferedOutputStream(out);
	        	while(in.read(b) > 0) {
	        		out.write(b);
	        	}
	        	out.flush();
	        	out.close();
	        	in.close();
			} catch(Exception e) {
				e.printStackTrace();
				throw e;
			} finally {
	        	if (in != null) {
	        		in.close();
	        	}
	        	if (fout != null) {
	        		fout.close();
	        	}
	        }
			return true;
		}
			
		BufferedImage bimage = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g = bimage.createGraphics();
		g.setBackground(Color.white);
		g.drawImage(theImg, 0, 0, null);
		
		if (isLogoImg) {//生成图标水印
			//设置图片透明度
			g.setComposite(AlphaComposite
					.getInstance(AlphaComposite.SRC_OVER, logoSrcOver));
			
			width = (int)(width * logoPosition) - w;
			height = (int)(height * logoPosition) - h;
			
			width = width < 0 ? 0 : width;
			height = height < 0 ? 0 : height;
			
			g.drawImage(waterImg, width, height, null);
		} else {//生成背景水印
			//'0.2f'设置字体透明度
			g.setComposite(AlphaComposite
					.getInstance(AlphaComposite.SRC_OVER, bgSrcOver));
			int sw = (width % w) /(width / w + 1);//填充水印图片横向间距
			int sh = (height % h) /(height / h + 1);//填充水印图片纵向间距
			for(int i = sw; i + w + sw <= width; i += w + sw) {
				for (int j = sh; j + h + sh <= height; j += h + sh) {
					g.drawImage(waterImg, i, j, null);
				}
			}
		}
		g.dispose();
		try {
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
			param.setQuality(80f, true);
			encoder.encode(bimage);
		} catch (Exception e) {
			throw e;
		} finally {
			if (out != null) {
				out.close();
        	}
		}
		return true;
	}
}

 

分享到:
评论
1 楼 水瘦山寒 2008-08-21  
createMark 怎么关键方法createMark没全啊??

相关推荐

    java实现图片水印添加

    以上就是使用Java实现图片水印添加的基本流程和关键知识点。实际应用中,还可以根据需求进行更复杂的定制,比如动态调整水印位置、角度、颜色等。通过熟练掌握这些技巧,你可以轻松地在自己的项目中添加专业级别的...

    采用java实现图片水印

    本篇文章将详细探讨如何使用Java实现图片水印的添加,以及相关的知识点。 首先,我们需要了解Java中的图像处理库。Java标准库提供了`java.awt`和`javax.imageio`包,它们包含了处理图像的基本功能。`java.awt`包中...

    使用java实现图片水印

    ### 使用Java实现图片水印的关键知识点 #### 一、背景介绍 在当今互联网时代,图片作为信息传递的重要载体之一,在各个领域中发挥着至关重要的作用。为了保护图片版权或者增加品牌标识度,很多网站和应用会选择为...

    JAVA实现给图片增加图片水印或者文字水印-依赖包

    在Java编程中,给图片添加水印是一项常见的需求,无论是为了版权保护还是...但以上代码已经足够作为基础,帮助你开始在Java中实现图片加水印的功能。记得在运行此代码前,确保已经正确引入了Apache Commons Imaging库。

    java 图片水印 改变图片大小

    总结来说,Java提供了丰富的API来处理图片水印和大小改变,而Struts2则提供了强大的Web开发支持。结合这两者,我们可以构建出高效、灵活的图片处理服务。理解并熟练掌握这些技术,对于提升Java Web开发能力大有裨益...

    java实现图片上传并添加水印效果(文字水印,蒙版,logo图片),自动进行文字大小行数位置匹配 ,文字自动换行

    在Java编程中,实现图片上传并添加水印效果是一项常见的任务,这通常涉及到图像处理、图形用户界面(GUI)和文件I/O等多个方面。在这个项目中,我们将关注以下几个关键知识点: 1. **Java图像处理库**:Java标准库...

    java给图片添加水印

    2. **创建水印工具类**:创建一个名为`WatermarkUtils`的Java类,包含添加文字水印和图片水印的方法。 - **添加文字水印**:首先读取原始图片,然后创建一个含有文字的透明图像(水印),设置合适的字体、颜色、...

    java Jacob完美实现word添加图片水印(内附源码及jar包)

    java Jacob完美实现word添加图片水印(内附源码及jar包)。 公司最近让搞Word文档添加水印,所有下载的文档需要添加公司印章,搞了好多天才实现,利用Jacob完美实现word添加图片水印(注意需要把dll文件放到jdk的bin...

    java图片加水印(适应铺满)

    开发一个项目,需要用到图片加水印的功能,这里考虑使用后台加水印,在上传的时候或者回显到页面时候,取图片文件的流数据,进行加水印在返回流数据就行了,非常简单,不懂可以问我

    java操作excel实现水印图片

    java操作excel实现水印图片

    Java 实现word文件增加图片水印 jacob实现 用到的jar

    在处理文档操作时,Java提供了一些库来实现高级功能,比如在Word文档中添加图片水印。本篇将深入探讨如何使用Java和两个特定的库——iTextPDF与Jacob——来实现这一目标。 首先,iTextPDF是一个开源的Java库,专门...

    java中处理图片水印

    在Java编程语言中,处理图片水印涉及到图像处理和图形绘制技术。`Graphics2D`是Java 2D API的一部分,它提供了丰富的功能,可以用来在图像上添加文本、图像等元素,实现水印效果。下面我们将深入探讨如何使用`...

    java实现对图片加水印

    总结一下,Java 2D API和JAI库都能帮助我们实现图片加水印的功能。选择哪种方式取决于具体需求,如性能、复杂性和可用资源。理解这些概念和步骤,开发者就能根据实际情况编写出自己的Java代码,实现个性化的图片水印...

    JAVA 实现图片水印

    实现图片填加水印的效果,网上找的很不错,可以借鉴一下

    java操作wordpdf图片生成图片水印

    总的来说,Java通过Apache POI和PDFBox等库,为开发者提供了强大的工具来操作Word和PDF文档,并生成图片水印。这不仅可以提高工作效率,也能有效地保护和标记文档内容。通过深入学习和实践,开发者可以掌握这些技能...

    基于Java给图片添加文字或图片水印

    本项目“基于Java给图片添加文字或图片水印”旨在教授如何利用Java实现这一功能,适用于大学生的课程设计学习,尤其是对于大二学生来说,是一个很好的实践项目。 首先,我们需要了解Java中的图像处理库。Java标准库...

    水印 java Graphics2D实现文字图片水印

    下面将详细介绍如何使用Java Graphics2D实现文字和图片水印,以及如何在四个角落添加水印。 首先,我们要导入必要的Java库,包括java.awt和javax.imageio: ```java import java.awt.*; import java.awt.image....

    java 水印(水印适应图片大小,但个别图片太小不支持)

    本知识点主要探讨如何在Java中实现自适应图片大小的水印功能,以及遇到图片过小时的处理策略。 首先,我们需要理解水印的基本概念。水印是在图像或文档上添加的一种视觉标记,它可以是文字、图像或者图形,用于表明...

    Java实现在图片上添加水印图片和水印文字.doc

    Java 实现图片添加水印图片和水印文字 Java 是一种广泛应用于企业级开发的编程语言,拥有强大灵活的图形处理能力。本文将详细介绍如何使用 Java 实现图片添加水印图片和水印文字,并对代码进行解释。 图片添加水印...

    图片加水印 java代码实现

    图片加水印 java代码实现

Global site tag (gtag.js) - Google Analytics