Java中为图片添加水印效果的方法——实例代码

直接写出代码:

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.font.TextAttribute;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import com.haohaosh.common.util.regex.RegexUtil;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
*
* @项目名 ssh
* @功能 为图片添加水印效果
* @类名 ImageWaterMark
* @作者 Java自学通
* @日期 Aug 30, 20113:27:33 PM
* @版本 1.0
*/
public class ImageWaterMark {
private static final String HEAD = "好好生活网";
private static final String END = "www.haohaosh.com";
// 生成水印文件调用的方�?
private ImageWaterMark() {
}
/**
* 得到网站默认水印的缓存图�?
*
* @param image
* 图片
* @param fontType
* 字体
* @param apha
* 背景透明�?
* @param apha1
* 前景透明�?
* @return 缓存图片
*/
private static BufferedImage getMarkBufferedImage(Image image,
String fontType, float apha, float apha1) {
int width = image.getWidth(null);
int height = image.getHeight(null);
int fontSize = width / 15;
BufferedImage bimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Font f = new Font(fontType, Font.PLAIN, fontSize);
Graphics2D g = bimage.createGraphics();
g.drawImage(image, 0, 0, null);
g.setFont(f);
AttributedString ats = new AttributedString(HEAD);
ats.addAttribute(TextAttribute.FONT, f, 0, HEAD.length());
AttributedCharacterIterator iter = ats.getIterator();
FontMetrics fm = g.getFontMetrics();
AttributedString ats1 = new AttributedString(END);
ats1.addAttribute(TextAttribute.FONT, f, 0, END.length());
AttributedCharacterIterator iter1 = ats1.getIterator();
FontMetrics fm1 = g.getFontMetrics();
int size = fm.stringWidth(HEAD);
int size1 = fm1.stringWidth(END) + 2;
g.setColor(Color.black);
g.setComposite(AlphaComposite
.getInstance(AlphaComposite.SRC_OVER, apha));
g.fill3DRect(0, 0, width, fontSize * 2 + 2, true);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
apha1));
g.setColor(Color.white);
int center = ((width - size) - (width - size1)) / 2;
g.drawString(iter, width - (size + center), fontSize);
g.drawString(iter1, width - size1, fontSize * 2);
g.dispose();
return bimage;
}
/**
* 根据水印内容、显示位置得到缓存图�?
*
* @param image
* 图片
* @param fontType
* 字体
* @param content
* 水印内容
* @param apha
* 背景透明�?
* @param apha1
* 前景透明�?
* @param fontSize
* 字体大小
* @param postion
* 位置
* @return 缓存图片
*/
public static BufferedImage getMarkBufferedImage(Image image,
String fontType, String content, float apha, float apha1,
int fontSize, Direction postion) {
int width = image.getWidth(null);
int height = image.getHeight(null);
BufferedImage bimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = bimage.createGraphics();
g.drawImage(image, 0, 0, null);
AttributedString ats = null;
AttributedCharacterIterator iter = null;
FontMetrics fm = null;
Font f = null;
int size = 0;
do {
f = new Font(fontType, Font.PLAIN, fontSize);
g.setFont(f);
ats = new AttributedString(content);
ats.addAttribute(TextAttribute.FONT, f, 0, content.length());
iter = ats.getIterator();
fm = g.getFontMetrics();
size = fm.stringWidth(content);
fontSize--;
} while (size > width && fontSize > 0);
fontSize++;
int x = 2, y = fontSize + fontSize / 2, h = 0;
if (postion == Direction.LEFT) {
h = height / 2 - (fontSize * 2 + 2) / 2;
y = height / 2 + fontSize / 2 - 2;
} else if (postion == Direction.RIGHT) {
h = height / 2 - (fontSize * 2 + 2) / 2;
y = height / 2 + fontSize / 2 - 2;
x = width - size;
} else if (postion == Direction.RIGHT_BOTTOM) {
h = height - (fontSize * 2 + 2);
x = width - size;
y = height - fontSize / 2 - 2;
} else if (postion == Direction.CONTENT) {
h = height / 2 - (fontSize * 2 + 2) / 2;
y = height / 2 + fontSize / 2 - 2;
x = width / 2 - size / 2;
} else if (postion == Direction.LEFT_BOTTOM) {
h = height - (fontSize * 2 + 2);
y = height - fontSize / 2 - 2;
} else if (postion == Direction.RIGHT_TOP) {
x = width - size;
} else if (postion == Direction.BOTTOM_CENTER) {
h = height - (fontSize * 2 + 2);
x = width / 2 - size / 2;
y = height - fontSize / 2 - 2;
} else if (postion == Direction.TOP_CENTER) {
x = width / 2 - size / 2;
}
g.setColor(Color.black);
g.setComposite(AlphaComposite
.getInstance(AlphaComposite.SRC_OVER, apha));
g.fill3DRect(0, h, width, fontSize * 2 + 2, true);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
apha1));
g.setColor(Color.white);
g.drawString(iter, x, y);
g.dispose();
return bimage;
}
/**
* 根据图片、内容�?�输出流输出加水印后的图�?
*
* @param img
* 图片
* @param content
* 水印文字
* @param stream
* 输出�?
*
*/
public static void outPutWebImageString(Image img, String content,
OutputStream stream) {
outPutWebImageString(img, content, stream, 0.3f, 1.0f, 16, "隶书");
}
/**
* 创建水印图片保存到输出流�?
*
* @param img
* @param content
* @param stream
* @param aph
* @param aph1
* @param fontSize
* @param font
*/
public static void outPutWebImageString(Image img, String content,
OutputStream stream, float aph, float aph1, int fontSize,
String font) {
writeImage(getMarkBufferedImage(img, font, content, aph, aph1,
fontSize, Direction.BOTTOM_CENTER), stream, null);
}
public static void outPutWebImageString(String content,
OutputStream stream, String filePath, float aph, float aph1,
int fontSize, String font) {
File file = new File(filePath);
if (file.isFile()) {
ImageIcon imgIcon = new ImageIcon(file.getAbsolutePath());
outPutWebImageString(imgIcon.getImage(), content, stream, aph,
aph1, fontSize, font);
}
}
public static void outPutWebImage(OutputStream stream, String filePath) {
outPutWebImage(stream, filePath, "时尚中黑�?�?", 0.3f, 0.7f);
}
public static void outPutWebImage(OutputStream stream, String filePath,
String font, float aph, float aph1) {
File file = new File(filePath);
if (file.isFile()) {
ImageIcon imgIcon = new ImageIcon(file.getAbsolutePath());
writeImage(
getMarkBufferedImage(imgIcon.getImage(), font, aph, aph1),
stream, filePath);
}
}
/**
* 根据路径生成水印图片保存到相对应目录(_back)
*
* @param path
*/
public static void execute(String path) {
File file = new File(path);
// 目标目录
StringBuffer targetDir = new StringBuffer();
if (file.isDirectory()) {
targetDir.append(file.getAbsolutePath()).append("_back");
writeImage(file.listFiles(), targetDir);
} else if (file.isFile()) {
ImageIcon imgIcon = new ImageIcon(file.getAbsolutePath());
writeImage(getMarkBufferedImage(imgIcon.getImage(), "时尚中黑�?�?",
0.3f, 0.7f), file.getParentFile().getAbsolutePath()
+ File.separator + "back_" + file.getName());
}
}
// �?查文件格�?
private static boolean checkFile(String path) {
Pattern pt = Pattern.compile("(\.jpg)|(\.jpeg)",
Pattern.CASE_INSENSITIVE);
Matcher mc = pt.matcher(path);
return mc.find();
}
private static void writeImage(File[] files, StringBuffer targetDir) {
File temp = new File(targetDir.toString());
if (!temp.exists())
temp.mkdirs();
for (File file : files) {
if (file.isDirectory()) {
targetDir.append("/").append(file.getName());
writeImage(file.listFiles(), targetDir);
} else if (checkFile(file.getName())) {
ImageIcon imgIcon = new ImageIcon(file.getAbsolutePath());
writeImage(getMarkBufferedImage(imgIcon.getImage(), "时尚中黑体",
0.3f, 0.7f), temp.getAbsolutePath() + File.separator
+ file.getName());
}
}
}
private static boolean writeImage(BufferedImage im, String filePath) {
FileOutputStream out = null;
try {
out = new FileOutputStream(filePath);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(im);
param.setQuality(50f, true);
encoder.encode(im, param);
out.flush();
} catch (Exception e) {
return false;
} finally {
try {
if (out != null) {
out.close();
out = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
private static void writeImage(BufferedImage im, OutputStream stream,
String filePath) {
try {
String temp = RegexUtil.getContentByRegex(filePath,
"(.+?)(\.)(.+)", 3);
;
if (temp == null)
ImageIO.write(im, "JPEG", stream);
else
ImageIO.write(im, temp, stream);
} catch (Exception e) {
} finally {
try {
if (stream != null) {
stream.close();
stream = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

原文发布于微信公众号 - Java学习网(javalearns)

原文发表时间:2017-11-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏烙馅饼喽的技术分享

生成透明GIF的方法

Private Shared Function CreateTransParentGif(ByVal img As Image) As Bitmap      ...

363130
来自专栏Hongten

java画图程序_图片用字母画出来_源码发布_版本二

在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中。

19120
来自专栏跟着阿笨一起玩NET

推荐一款DataGridView的打印解决方案

今天有朋友请教在CS的WinForm中如何打印DataGridView中的内容。 网上搜索一番之后,还是在藏宝库CodeProject中找到一篇好文章《Dat...

7320
来自专栏Duncan's Blog

neo4j官方开发文档阅读记录

neo-4j由两部分组成:relationship,label和property,label或者relationship中包含property,label与la...

49110
来自专栏Jack的Android之旅

android自定义钟表android自定义钟表

接下来就是设定这个自定义View的大小,在没有大小自适应的时候,view的高度我这位整个手机屏幕高度的三分之一,宽度为整个屏幕的宽度

10110
来自专栏菩提树下的杨过

Silverlight:Mouse Avoiding 躲避鼠标效果

昨晚在一国外博客上(从域名后缀pl上猜想应该是波兰)看到这种效果(Mouse Avoid 躲避鼠标),是基于Flash/AS3开发的,这个示例把弹性运动,摩擦力...

22570
来自专栏Albert陈凯

Programming with Objective-C方法命名规范

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Progr...

20930
来自专栏BY的专栏

iOS开发技巧:实现电话号码文本框

32860
来自专栏我就是马云飞

直播间气泡效果

这个效果是之前看过的,正好是很典型的跟动画相关的例子,我这里就拿来跟大家分享一下,如果你以前看过又很熟悉动画那就可以略过,如果不是很熟悉或者没看过那...

27150
来自专栏马洪彪

C#生成二维码,裁切边框

使用google zxing生成的二维码带有白色边框,显示在报告(使用Crystal Report 水晶报表)上时,由于空间有限造成二维码过小难以扫描识别。 通...

46550

扫码关注云+社区

领取腾讯云代金券