package img; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; public class Mark { public static void main(String[] args) throws IOException { // 输入输出文件路径/文件 String src = "D:\\test\\map.jpg"; String dest = "D:\\test\\map1.jpg"; File srcFile = new File(src); File destFile = new File(dest); // 将输入文件转换为字节数组 byte[] bytes = getByte(srcFile); // 生成水印(Base64) String mark = createMark(); // 打水印 byte[] result = addImageMark(bytes, "jpg", mark); FileOutputStream fos = new FileOutputStream(destFile); fos.write(result); fos.close(); } /** * 生成水印(Base64) */ public static String createMark() throws IOException{ // 水印文件路径 String mark = "D:\\test\\time.jpg"; File markFile = new File(mark); // 获取水印图片二进制文件 byte[] bytes = getByte(markFile); // 获取水印图片Base64文件 String base64String = Base64.encodeBase64String(bytes); System.out.println(base64String); return base64String; } /** * 将File文件转为字节数组 */ public static byte[] getByte(File file){ byte[] bytes = null; try { FileInputStream fis = new FileInputStream(file); bytes = new byte[fis.available()]; fis.read(bytes); fis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return bytes; } /** * 水印之间的间隔 */ private static final int INTERVAL = 150; private static final float ALPHA = 0.3F; private static final float MULTIPLE = 1.5F; /** * 给图片加水印 * @param content 图片内容 * @param suffix 图片后缀 * @param watermarkImage Base64格式的水印 * @return */ public static byte[] addImageMark(byte[] bytes, String suffix, String watermarkImage) { if (bytes != null && bytes.length > 0) { BufferedImage bufferedImage = null; ByteArrayOutputStream byteArrayOutputStream = null; try { ByteArrayInputStream in = new ByteArrayInputStream(bytes); Image image2 = ImageIO.read(in); int width = image2.getWidth(null); int height = image2.getHeight(null); bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufferedImage.createGraphics(); g.drawImage(image2, 0, 0, width, height, null); byte[] watermarkArray = Base64.decodeBase64(watermarkImage); ByteArrayInputStream watermarkIn = new ByteArrayInputStream(watermarkArray); Image logoImage = ImageIO.read(watermarkIn); int width1 = logoImage.getWidth(null); int height1 = logoImage.getHeight(null); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA)); g.rotate(Math.toRadians(30), bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2); int x = -width / 2; int y; while (x < width * MULTIPLE) { y = -height / 2; while (y < height * MULTIPLE) { g.drawImage(logoImage, x, y, null); y += height1 + INTERVAL; } x += width1 + INTERVAL; } g.dispose(); byteArrayOutputStream = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, suffix, byteArrayOutputStream); return byteArrayOutputStream.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { if (bufferedImage != null) { bufferedImage.flush(); bufferedImage = null; // null是告诉jvm此资源可以回收 } IOUtils.closeQuietly(byteArrayOutputStream); System.gc(); // 让系统回收资源,但不一定是回收刚才设成null的资源,也可能是回收其他没用的资源 } } return bytes; } }