Java实现给图片添加图片水印,文字水印及马赛克的方法示例
程序员文章站
2023-12-04 10:46:22
本文实例讲述了java实现给图片添加图片水印,文字水印及马赛克的方法。分享给大家供大家参考,具体如下:
可以在eclipse中新建个utils类,把以下代码复制进去直接使...
本文实例讲述了java实现给图片添加图片水印,文字水印及马赛克的方法。分享给大家供大家参考,具体如下:
可以在eclipse中新建个utils类,把以下代码复制进去直接使用,以下方法实现单个或多个水印的添加
package com.rzxt.fyx.common.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 javax.imageio.imageio; import javax.swing.imageicon; /** * 给图片添加水印 * @author tgy * */ public class markimageutils { /** * @param args */ public static void main(string[] args) { string output = "f:/images/"; string source = "f:/images/6.jpg"; //源图片路径 string icon = "f:/images/icon2.png"; //覆盖图片路径 string imagename = "mark_image"; //图片名称 string imagetype = "jpg"; //图片类型jpg,jpeg,png,gif string text = "加水印了"; int size = 4; //马赛克大小 integer degree = null; //水印旋转角度-45,null表示不旋转 string result = null; //给图片添加图片水印 result = markimageutils.markimagebymoreicon(icon,source,output,imagename,imagetype,degree); // result = markimageutils.markimagebysingleicon(icon, source, output, imagename, imagetype, degree); // //给图片添加文字水印 // result = markimageutils.markimagebymoretext(source,output,imagename,imagetype,color.red,text,degree); // result = markimageutils.markimagebysingletext(source,output,imagename,imagetype,color.red,text,degree); // //给图片打马赛克 // result = markimageutils.markimagebymosaic(source,output,imagename,imagetype,size); system.out.println(result); } /** * 给图片不同位置添加多个图片水印、可设置水印图片旋转角度 * @param icon 水印图片路径(如:f:/images/icon.png) * @param source 没有加水印的图片路径(如:f:/images/6.jpg) * @param output 加水印后的图片路径(如:f:/images/) * @param imagename 图片名称(如:11111) * @param imagetype 图片类型(如:jpg) * @param degree 水印图片旋转角度,为null表示不旋转 */ public static string markimagebymoreicon(string icon,string source,string output,string imagename,string imagetype,integer degree) { string result = "添加图片水印出错"; try { file file = new file(source); file ficon = new file(icon); if (!file.isfile()) { return source + " 不是一个图片文件!"; } //将icon加载到内存中 image ic = imageio.read(ficon); //icon高度 int icheight = ic.getheight(null); //将源图片读到内存中 image img = imageio.read(file); //图片宽 int width = img.getwidth(null); //图片高 int height = img.getheight(null); bufferedimage bi = new bufferedimage(width,height,bufferedimage.type_int_rgb); //创建一个指定 bufferedimage 的 graphics2d 对象 graphics2d g = bi.creategraphics(); //x,y轴默认是从0坐标开始 int x = 0; int y = 0; //默认两张水印图片的间隔高度是水印图片的1/3 int temp = icheight/3; int space = 1; if(height>=icheight){ space = height/icheight; if(space>=2){ temp = y = icheight/2; if(space==1||space==0){ x = 0; y = 0; } } }else{ x = 0; y = 0; } //设置对线段的锯齿状边缘处理 g.setrenderinghint(renderinghints.key_interpolation,renderinghints.value_interpolation_bilinear); //呈现一个图像,在绘制前进行从图像空间到用户空间的转换 g.drawimage(img.getscaledinstance(width,height,image.scale_smooth),0,0,null); for(int i=0;i<space;i++){ if (null != degree) { //设置水印旋转 g.rotate(math.toradians(degree),(double) bi.getwidth() / 2, (double) bi.getheight() / 2); } //水印图象的路径 水印一般为gif或者png的,这样可设置透明度 imageicon imgicon = new imageicon(icon); //得到image对象。 image con = imgicon.getimage(); //透明度,最小值为0,最大值为1 float clarity = 0.6f; g.setcomposite(alphacomposite.getinstance(alphacomposite.src_atop,clarity)); //表示水印图片的坐标位置(x,y) //g.drawimage(con, 300, 220, null); g.drawimage(con, x, y, null); g.setcomposite(alphacomposite.getinstance(alphacomposite.src_over)); y+=(icheight+temp); } g.dispose(); file sf = new file(output, imagename+"."+imagetype); imageio.write(bi, imagetype, sf); // 保存图片 result = "图片完成添加icon水印"; } catch (exception e) { e.printstacktrace(); } return result; } /** * 给图片添加单个图片水印、可设置水印图片旋转角度 * @param icon 水印图片路径(如:f:/images/icon.png) * @param source 没有加水印的图片路径(如:f:/images/6.jpg) * @param output 加水印后的图片路径(如:f:/images/) * @param imagename 图片名称(如:11111) * @param imagetype 图片类型(如:jpg) * @param degree 水印图片旋转角度,为null表示不旋转 */ public static string markimagebysingleicon(string icon,string source,string output,string imagename,string imagetype,integer degree) { string result = "添加图片水印出错"; try { file file = new file(source); file ficon = new file(icon); if (!file.isfile()) { return source + " 不是一个图片文件!"; } //将icon加载到内存中 image ic = imageio.read(ficon); //icon高度 int icheight = ic.getheight(null); //将源图片读到内存中 image img = imageio.read(file); //图片宽 int width = img.getwidth(null); //图片高 int height = img.getheight(null); bufferedimage bi = new bufferedimage(width,height,bufferedimage.type_int_rgb); //创建一个指定 bufferedimage 的 graphics2d 对象 graphics2d g = bi.creategraphics(); //x,y轴默认是从0坐标开始 int x = 0; int y = (height/2)-(icheight/2); //设置对线段的锯齿状边缘处理 g.setrenderinghint(renderinghints.key_interpolation,renderinghints.value_interpolation_bilinear); //呈现一个图像,在绘制前进行从图像空间到用户空间的转换 g.drawimage(img.getscaledinstance(width,height,image.scale_smooth),0,0,null); if (null != degree) { //设置水印旋转 g.rotate(math.toradians(degree),(double) bi.getwidth() / 2, (double) bi.getheight() / 2); } //水印图象的路径 水印一般为gif或者png的,这样可设置透明度 imageicon imgicon = new imageicon(icon); //得到image对象。 image con = imgicon.getimage(); //透明度,最小值为0,最大值为1 float clarity = 0.6f; g.setcomposite(alphacomposite.getinstance(alphacomposite.src_atop,clarity)); //表示水印图片的坐标位置(x,y) //g.drawimage(con, 300, 220, null); g.drawimage(con, x, y, null); g.setcomposite(alphacomposite.getinstance(alphacomposite.src_over)); g.dispose(); file sf = new file(output, imagename+"."+imagetype); imageio.write(bi, imagetype, sf); // 保存图片 result = "图片完成添加icon水印"; } catch (exception e) { e.printstacktrace(); } return result; } /** * 给图片添加多个文字水印、可设置水印文字旋转角度 * @param source 需要添加水印的图片路径(如:f:/images/6.jpg) * @param output 添加水印后图片输出路径(如:f:/images/) * @param imagename 图片名称(如:11111) * @param imagetype 图片类型(如:jpg) * @param color 水印文字的颜色 * @param word 水印文字 * @param degree 水印文字旋转角度,为null表示不旋转 */ public static string markimagebymoretext(string source,string output,string imagename,string imagetype,color color,string word,integer degree) { string result = "添加文字水印出错"; try { //读取原图片信息 file file = new file(source); if (!file.isfile()) { return file + " 不是一个图片文件!"; } image img = imageio.read(file); //图片宽 int width = img.getwidth(null); //图片高 int height = img.getheight(null); //文字大小 int size = 50; //加水印 bufferedimage bi = new bufferedimage(width, height, bufferedimage.type_int_rgb); graphics2d g = bi.creategraphics(); g.drawimage(img, 0, 0, width, height, null); //设置水印字体样式 font font = new font("宋体", font.plain, size); //根据图片的背景设置水印颜色 g.setcolor(color); int x = width/3; int y = size; int space = height/size; for(int i=0;i<space;i++){ //如果最后一个坐标的y轴比height高,直接退出 if((y+size)>height){ break; } if (null != degree) { //设置水印旋转 g.rotate(math.toradians(degree),(double) bi.getwidth() / 2, (double) bi.getheight() / 2); } g.setfont(font); //水印位置 g.drawstring(word, x, y); y+=(2*size); } g.dispose(); //输出图片 file sf = new file(output, imagename+"."+imagetype); imageio.write(bi, imagetype, sf); // 保存图片 result = "图片完成添加word水印"; } catch (exception e) { e.printstacktrace(); } return result; } /** * 给图片添加单个文字水印、可设置水印文字旋转角度 * @param source 需要添加水印的图片路径(如:f:/images/6.jpg) * @param output 添加水印后图片输出路径(如:f:/images/) * @param imagename 图片名称(如:11111) * @param imagetype 图片类型(如:jpg) * @param color 水印文字的颜色 * @param word 水印文字 * @param degree 水印文字旋转角度,为null表示不旋转 */ public static string markimagebysingletext(string source,string output,string imagename,string imagetype,color color,string word,integer degree) { string result = "添加文字水印出错"; try { //读取原图片信息 file file = new file(source); if (!file.isfile()) { return file + " 不是一个图片文件!"; } image img = imageio.read(file); int width = img.getwidth(null); int height = img.getheight(null); //加水印 bufferedimage bi = new bufferedimage(width, height, bufferedimage.type_int_rgb); graphics2d g = bi.creategraphics(); g.drawimage(img, 0, 0, width, height, null); //设置水印字体样式 font font = new font("宋体", font.plain, 50); //根据图片的背景设置水印颜色 g.setcolor(color); if (null != degree) { //设置水印旋转 g.rotate(math.toradians(degree),(double) bi.getwidth() / 2, (double) bi.getheight() / 2); } g.setfont(font); int x = width/3; int y = height/2; //水印位置 g.drawstring(word, x, y); g.dispose(); //输出图片 file sf = new file(output, imagename+"."+imagetype); imageio.write(bi, imagetype, sf); // 保存图片 result = "图片完成添加word水印"; } catch (exception e) { e.printstacktrace(); } return result; } /** * 给图片加马赛克 * @param source 原图片路径(如:f:/images/6.jpg) * @param output 打马赛克后,图片保存的路径(如:f:/images/) * @param imagename 图片名称(如:11111) * @param imagetype 图片类型(如:jpg) * @param size 马赛克尺寸,即每个矩形的宽高 * @return */ public static string markimagebymosaic(string source,string output,string imagename,string imagetype,int size){ string result = "图片打马赛克出错"; try{ file file = new file(source); if (!file.isfile()) { return file + " 不是一个图片文件!"; } bufferedimage img = imageio.read(file); // 读取该图片 int width = img.getwidth(null); //原图片宽 int height = img.getheight(null); //原图片高 bufferedimage bi = new bufferedimage(width,height, bufferedimage.type_int_rgb); //马赛克格尺寸太大或太小 if (width < size || height < size) { return "马赛克格尺寸太大"; } if(size<=0){ return "马赛克格尺寸太小"; } int xcount = 0; //x方向绘制个数 int ycount = 0; //y方向绘制个数 if (width % size == 0) { xcount = width / size; } else { xcount = width / size + 1; } if (height % size == 0) { ycount = height / size; } else { ycount = height / size + 1; } int x = 0; //x坐标 int y = 0; //y坐标 //绘制马赛克(绘制矩形并填充颜色) graphics2d g = bi.creategraphics(); for (int i = 0; i < xcount; i++) { for (int j = 0; j < ycount; j++) { //马赛克矩形格大小 int mwidth = size; int mheight = size; if(i==xcount-1){ //横向最后一个不够一个size mwidth = width-x; } if(j == ycount-1){ //纵向最后一个不够一个size mheight = height-y; } //矩形颜色取中心像素点rgb值 int centerx = x; int centery = y; if (mwidth % 2 == 0) { centerx += mwidth / 2; } else { centerx += (mwidth - 1) / 2; } if (mheight % 2 == 0) { centery += mheight / 2; } else { centery += (mheight - 1) / 2; } color color = new color(img.getrgb(centerx, centery)); g.setcolor(color); g.fillrect(x, y, mwidth, mheight); y = y + size;// 计算下一个矩形的y坐标 } y = 0;// 还原y坐标 x = x + size;// 计算x坐标 } g.dispose(); file sf = new file(output, imagename+"."+imagetype); imageio.write(bi, imagetype, sf); // 保存图片 result = "打马赛克成功"; }catch(exception e){ e.printstacktrace(); } return result; } }
更多java相关内容感兴趣的读者可查看本站专题:《java图片操作技巧汇总》、《java日期与时间操作技巧汇总》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》及《java数据结构与算法教程》。
希望本文所述对大家java程序设计有所帮助。