锁定老帖子 主题:为图片写水印的时候中文乱码
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-24
public class WaterMarkUtils {
/** * 给图片添加水印 * @param filePath 需要添加水印的图片的路径 * @param markContent 水印的文字 * @param markContentColor 水印文字的颜色 * @param qualNum 图片质量 * @return */ public void mark(String srcImgPath, String outImgPath, String watermarkStr) { try { // 读取原图片信息 File srcImgFile = new File(srcImgPath); Image srcImg = ImageIO.read(srcImgFile); int srcImgWidth = srcImg.getWidth(null); int srcImgHeight = srcImg.getHeight(null); // 加水印 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufImg.createGraphics(); g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null); Font font = new Font("Courier New", Font.PLAIN, 12);
g.setFont(font); int x = srcImgWidth - getWatermarkLength(watermarkStr, g) - 3; int y = srcImgHeight - 3; g.drawString(watermarkStr, x, y); g.dispose(); // 输出图片 FileOutputStream outImgStream = new FileOutputStream(outImgPath); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } catch (Exception e) { e.printStackTrace(); } }
//获取水印文字总长度 public int getWatermarkLength(String str, Graphics2D g) { return g.getFontMetrics(g.getFont()).charsWidth(str.toCharArray(), 0, str.length()); }
public static void main(String[] args) { // 原图位置, 输出图片位置, 水印文字 new WaterMarkUtils().mark("c://test.jpg","c://watermark.jpg","是什么?"); // new test().mark(args[0], args[1], args[2]);
} } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-02-24
Font font = new Font("Courier New", Font.PLAIN, 12);这个字体不支持中文。
|
|
返回顶楼 | |
发表时间:2012-02-25
public class WaterMarkUtils { /** * 给图片添加水印 * * @param filePath 需要添加水印的图片的路径 * @param markContent 水印的文字 * @param markContentColor 水印文字的颜色 * @param qualNum 图片质量 * @return */ public void mark(String srcImgPath, String outImgPath, String watermarkStr) { try { // 读取原图片信息 File srcImgFile = new File(srcImgPath); Image srcImg = ImageIO.read(srcImgFile); int srcImgWidth = srcImg.getWidth(null); int srcImgHeight = srcImg.getHeight(null); // 加水印 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufImg.createGraphics(); g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null); Font font = new Font("宋体", Font.PLAIN, 50); g.setColor(Color.gray); // 根据图片的背景设置水印颜色 g.setFont(font); int x = (srcImgWidth - getWatermarkLength(watermarkStr, g)) / 2; int y = srcImgHeight / 2; g.drawString(watermarkStr, x, y); g.dispose(); // 输出图片 FileOutputStream outImgStream = new FileOutputStream(outImgPath); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } catch (Exception e) { e.printStackTrace(); } } // 获取水印文字总长度 public int getWatermarkLength(String str, Graphics2D g) { return g.getFontMetrics(g.getFont()).charsWidth(str.toCharArray(), 0, str.length()); } public static void main(String[] args) { // 原图位置, 输出图片位置, 水印文字 new WaterMarkUtils().mark("c://12.jpg", "c://watermark.jpg", "水印就是这样的!!!!"); } } |
|
返回顶楼 | |
发表时间:2012-02-27
selvemen 写道 public class WaterMarkUtils { /** * 给图片添加水印 * * @param filePath 需要添加水印的图片的路径 * @param markContent 水印的文字 * @param markContentColor 水印文字的颜色 * @param qualNum 图片质量 * @return */ public void mark(String srcImgPath, String outImgPath, String watermarkStr) { try { // 读取原图片信息 File srcImgFile = new File(srcImgPath); Image srcImg = ImageIO.read(srcImgFile); int srcImgWidth = srcImg.getWidth(null); int srcImgHeight = srcImg.getHeight(null); // 加水印 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufImg.createGraphics(); g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null); Font font = new Font("宋体", Font.PLAIN, 50); g.setColor(Color.gray); // 根据图片的背景设置水印颜色 g.setFont(font); int x = (srcImgWidth - getWatermarkLength(watermarkStr, g)) / 2; int y = srcImgHeight / 2; g.drawString(watermarkStr, x, y); g.dispose(); // 输出图片 FileOutputStream outImgStream = new FileOutputStream(outImgPath); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } catch (Exception e) { e.printStackTrace(); } } // 获取水印文字总长度 public int getWatermarkLength(String str, Graphics2D g) { return g.getFontMetrics(g.getFont()).charsWidth(str.toCharArray(), 0, str.length()); } public static void main(String[] args) { // 原图位置, 输出图片位置, 水印文字 new WaterMarkUtils().mark("c://12.jpg", "c://watermark.jpg", "水印就是这样的!!!!"); } } 有没有加水印图片的。 |
|
返回顶楼 | |
发表时间:2012-02-27
选用一个中文字体就可以了。
|
|
返回顶楼 | |
发表时间:2012-02-28
可以直接用文字图片做水印
|
|
返回顶楼 | |
发表时间:2012-02-28
youarestupid 写道 selvemen 写道 public class WaterMarkUtils { /** * 给图片添加水印 * * @param filePath 需要添加水印的图片的路径 * @param markContent 水印的文字 * @param markContentColor 水印文字的颜色 * @param qualNum 图片质量 * @return */ public void mark(String srcImgPath, String outImgPath, String watermarkStr) { try { // 读取原图片信息 File srcImgFile = new File(srcImgPath); Image srcImg = ImageIO.read(srcImgFile); int srcImgWidth = srcImg.getWidth(null); int srcImgHeight = srcImg.getHeight(null); // 加水印 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufImg.createGraphics(); g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null); Font font = new Font("宋体", Font.PLAIN, 50); g.setColor(Color.gray); // 根据图片的背景设置水印颜色 g.setFont(font); int x = (srcImgWidth - getWatermarkLength(watermarkStr, g)) / 2; int y = srcImgHeight / 2; g.drawString(watermarkStr, x, y); g.dispose(); // 输出图片 FileOutputStream outImgStream = new FileOutputStream(outImgPath); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } catch (Exception e) { e.printStackTrace(); } } // 获取水印文字总长度 public int getWatermarkLength(String str, Graphics2D g) { return g.getFontMetrics(g.getFont()).charsWidth(str.toCharArray(), 0, str.length()); } public static void main(String[] args) { // 原图位置, 输出图片位置, 水印文字 new WaterMarkUtils().mark("c://12.jpg", "c://watermark.jpg", "水印就是这样的!!!!"); } } 有没有加水印图片的。 public final class WaterMark { private static List logoImgs; private static List bgImgs; private static boolean flag; public static List getBgImgs() { return bgImgs; } /** * 把图片印刷到图片上 * * @param pressImg -- * 水印文件 * @param targetImg -- * 目标文件 * @param x * --x坐标 * @param y * --y坐标 * @param out * 输出流(可以来自HttpServletReponse的输出) */ public final static void pressImage(String pressImg, String targetImg, int x, int y,OutputStream out) { try { //目标文件 File _file = new File(targetImg); Image src = ImageIO.read(_file); int wideth = src.getWidth(null); int height = src.getHeight(null); BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.createGraphics(); g.drawImage(src, 0, 0, wideth, height, null); //水印文件 File _filebiao = new File(pressImg); Image src_biao = ImageIO.read(_filebiao); int wideth_biao = src_biao.getWidth(null); int height_biao = src_biao.getHeight(null); g.drawImage(src_biao, (wideth - wideth_biao) / 2, (height - height_biao) / 2, wideth_biao, height_biao, null); //水印文件结束 g.dispose(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 打印文字水印图片 * * @param pressText * --文字 * @param targetImg -- * 目标图片 * @param fontName -- * 字体名 * @param fontStyle -- * 字体样式 * @param color -- * 字体颜色 * @param fontSize -- * 字体大小 * @param x -- * 偏移量(从右下角算起) * @param y -- * 偏移量(从右下角算起) * * @param out * 输出流(可以来自HttpServletReponse的输出) */ public static void pressText(String pressText, String targetImg, String fontName, int fontStyle, int color, int fontSize, int x, int y,OutputStream out) { try { File _file = new File(targetImg); Image src = ImageIO.read(_file); int wideth = src.getWidth(null); int height = src.getHeight(null); BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.createGraphics(); g.drawImage(src, 0, 0, wideth, height, null); g.setColor(new Color(color)); g.setFont(new Font(fontName, fontStyle, fontSize)); g.drawString(pressText, wideth - fontSize - x, height - fontSize / 2 - y); g.dispose(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); } catch (Exception e) { System.out.println(e); } } /** * 设置背景水印图片的路径并把图片加载到内存 * * @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()); } } /** * 图片中添加图标水印并输出到指定流 * * @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; 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); if (width < 200 || height < 200) {// 小图片不加水印真接输入,如头像图片 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(); return true; } catch (Exception e) { e.printStackTrace(); throw e; } } return false; } } |
|
返回顶楼 | |
浏览 7193 次