您的位置:首页 > 编程语言 > Java开发

java实现文章图片水印效果的代码实例

2011-04-04 13:08 1156 查看
以前用到的java给图片加水印效果代码都有些小问题,今天我们修正了里面的问题 增加了补白的功能 重构了代码

import java.awt.alphacomposite;

import java.awt.color;

import java.awt.font;

import java.awt.graphics2d;

import java.awt.image;

import java.awt.geom.affinetransform;

import java.awt.image.affinetransformop;

import java.awt.image.bufferedimage;

import java.io.file;

import java.io.ioexception;

import javax.imageio.imageio;

/**

* @author eric xu

*

*/

public final class imageutils {

/**

* 图片水印

* @param pressimg 水印图片

* @param targetimg 目标图片

* @param x 修正值 默认在中间

* @param y 修正值 默认在中间

* @param alpha 透明度

*/

public final static void pressimage(string pressimg, string targetimg, int x, int y, float alpha) {

try {

file img = new file(targetimg);

image src = imageio.read(img);

int wideth = src.getwidth(null);

int height = src.getheight(null);

bufferedimage image = new bufferedimage(wideth, height, bufferedimage.type_int_rgb);

graphics2d g = image.creategraphics();

g.drawimage(src, 0, 0, wideth, height, null);

//水印文件

image src_biao = imageio.read(new file(pressimg));

int wideth_biao = src_biao.getwidth(null);

int height_biao = src_biao.getheight(null);

g.setcomposite(alphacomposite.getinstance(alphacomposite.src_atop, alpha));

g.drawimage(src_biao, (wideth - wideth_biao) / 2, (height - height_biao) / 2, wi deth_biao, height_biao, null);

//水印文件结束

g.dispose();

imageio.write((bufferedimage) image, "jpg", img);

} catch (exception e) {

e.printstacktrace();

}

}

/**

* 文字水印

* @param presstext 水印文字

* @param targetimg 目标图片

* @param fontname 字体名称

* @param fontstyle 字体样式

* @param color 字体颜色

* @param fontsize 字体大小

* @param x 修正值

* @param y 修正值

* @param alpha 透明度

*/

public static void presstext(string presstext, string targetimg, string fontname, int fontstyle, color color, int fontsize, int x, int y, float alpha) {

try {

file img = new file(targetimg);

image src = imageio.read(img);

int width = src.getwidth(null);

int height = src.getheight(null);

bufferedimage image = new bufferedimage(width, height, bufferedimage.type_int_rgb);

graphics2d g = image.creategraphics();

g.drawimage(src, 0, 0, width, height, null);

g.setcolor(color);

g.setfont(new font(fontname, fontstyle, fontsize));

g.setcomposite(alphacomposite.getinstance(alphacomposite.src_atop, alpha));

g.drawstring(presstext, (width - (getlength(presstext) * fontsize)) / 2 + x, (he ight - fontsize) / 2 + y);

g.dispose();

imageio.write((bufferedimage) image, "jpg", img);

} catch (exception e) {

e.printstacktrace();

}

}

/**

* 缩放

* @param filepath 图片路径

* @param height 高度

* @param width 宽度

* @param bb 比例不对时是否需要补白

*/

public static void resize(string filepath, int height, int width, boolean bb) {

try {

double ratio = 0.0; //缩放比例 www.3ppt.com

file f = new file(filepath);

bufferedimage bi = imageio.read(f);

image itemp = bi.getscaledinstance(width, height, bi.scale_smooth);

//计算比例

if ((bi.getheight() > height) || (bi.getwidth() > width)) {

if (bi.getheight() > bi.getwidth()) {

ratio = (new integer(height)).doublevalue() / bi.getheight();

} else {

ratio = (new integer(width)).doublevalue() / bi.getwidth(); }

affinetransformop op = new affinetransformop(affinetransform.getscaleinstance(ratio, ratio), null);

itemp = op.filter(bi, null);

}

if (bb) {

bufferedimage image =

new bufferedimage(width, height, bufferedimage.type_int_rgb);

graphics2d g = image.creategraphics();

g.setcolor(color.white);

g.fillrect(0, 0, width, height);

if (width == itemp.getwidth(null))

g.drawimage(itemp, 0, (height - itemp.getheight(null)) / 2, itemp.getwidth(null), itemp.getheight(null), color.white, null);

else

g.drawimage(itemp, (width - itemp.getwidth(null)) / 2, 0, itemp.getwidth(null), i temp.getheight(null), color.white, null);

g.dispose();

itemp = image;

}

imageio.write((bufferedimage) itemp, "jpg", f);

} catch (ioexception e) {

e.printstacktrace();

}

}

public static void main(string[] args) throws ioexception {

pressimage("g:imgtestsy.jpg", "g:imgtesttest1.jpg", 0, 0, 0.5f);

presstext("我是文字水印", "g:imgtesttest1.jpg", "黑体", 36, color.white, 80, 0, 0, 0.3f);

resize("g:imgtesttest1.jpg", 500, 500, true);

}

public static int getlength(string text) {

int length = 0;

for (int i = 0; i < text.length(); i++) {

if (new string(text.charat(i) + "").getbytes().length > 1) {

length += 2;

} else {

length += 1;

}

}

return length / 2;

}

}
getlength 这个方法用来得到文字的长度 全角一个字 半角算半个字 但是感觉这种方法不太好
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息