这是个很经常使用的操做,通常咱们的网站在用户上传图片时都会给图片添加一个水印以防止其余站点盗图的行为java
实现功能:①给图片增长文字水印②给图片增长图片水印测试
// 加文字水印 public void mark(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) { Graphics2D g = bufImg.createGraphics(); g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null); g.setColor(color); g.setFont(font); g.drawString(text, x, y); g.dispose(); }
// 加图片水印 public void mark(BufferedImage bufImg, Image img, Image markImg, int width, int height, int x, int y) { Graphics2D g = bufImg.createGraphics(); g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null); g.drawImage(markImg, x, y, width, height, null); g.dispose(); }
补充:字体
为何要这么写?网站
考虑到该方法不只能够用于给图片文件增长水印,并且还能够给视频的每一帧图像也添加,因此为了方便不一样场合重复使用,去除了没必要要的依赖关系。ui
有了核心的两个方法就咱们能够给图片文件增长水印了spa
/** * 给图片增长文字水印 * * @param imgPath * -要添加水印的图片路径 * @param outImgPath * -输出路径 * @param text-文字 * @param font * -字体 * @param color * -颜色 * @param x * -文字位于当前图片的横坐标 * @param y * -文字位于当前图片的竖坐标 */ public void mark(String imgPath, String outImgPath, String text, Font font, Color color, int x, int y) { try { // 读取原图片信息 File imgFile = null; Image img = null; if (imgPath != null) { imgFile = new File(imgPath); } if (imgFile != null && imgFile.exists() && imgFile.isFile() && imgFile.canRead()) { img = ImageIO.read(imgFile); } int imgWidth = img.getWidth(null); int imgHeight = img.getHeight(null); // 加水印 BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); mark(bufImg, img, text, font, color, x, y); // 输出图片 FileOutputStream outImgStream = new FileOutputStream(outImgPath); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } catch (Exception e) { e.printStackTrace(); } }
/** * 给图片增长图片水印 * * @param inputImg * -源图片,要添加水印的图片 * @param markImg * - 水印图片 * @param outputImg * -输出图片(能够是源图片) * @param width * - 水印图片宽度 * @param height * -水印图片高度 * @param x * -横坐标,相对于源图片 * @param y * -纵坐标,同上 */ public void mark(String inputImg, String markImg, String outputImg, int width, int height, int x, int y) { // 读取原图片信息 File inputImgFile = null; File markImgFile = null; Image img = null; Image mark = null; try { if (inputImg != null && markImg != null) { inputImgFile = new File(inputImg); markImgFile = new File(markImg); } if (inputImgFile != null && inputImgFile.exists() && inputImgFile.isFile() && inputImgFile.canRead()) { img = ImageIO.read(inputImgFile); } if (markImgFile != null && markImgFile.exists() && markImgFile.isFile() && markImgFile.canRead()) { mark = ImageIO.read(markImgFile); } int imgWidth = img.getWidth(null); int imgHeight = img.getHeight(null); BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); mark(bufImg, img, mark, width, height, x, y); FileOutputStream outImgStream = new FileOutputStream(outputImg); ImageIO.write(bufImg, "jpg", outImgStream); outImgStream.flush(); outImgStream.close(); } catch (IOException e) { e.printStackTrace(); } }
文字水印的字体和颜色须要自行定义,这里咱们使用宋体,14号字体,颜色选择橙色 - -!,坐标是x轴0,y轴等于字体的大小,也就是图片的左上角。.net
public static void main(String[] args) { Font font = new Font("宋体", Font.PLAIN, 14); // 原图位置, 输出图片位置, 水印文字颜色, 水印文字 // new MarkText4J().mark("eguidMarkText2.jpg", "eguidMarkText2.jpg", "水印效果测试", font, Color.ORANGE, 0, 14); // 增长图片水印 new MarkText4J().mark("eguidMarkText2.jpg", "eguid.jpg", "eguidMarkText3.jpg", 40, 20, 0, 14); }简直棒极了,至此咱们能够随意的给图片任意位置添加任意文字或者图片水印了。
最后,额。。。导出的图片比本来图片还小是什么鬼?欢迎加入讨论群一块儿讨论:371249677。- -!
code