• base64转图片、图片转base64、图片拼接、加水印(水印角度可设置)


     1 /**
     2      * @Description: 将base64编码字符串转换为图片
     3      * @param imgStr
     4      *            base64编码字符串
     5      * @param path
     6      *            图片路径-具体到文件
     7      * @return
     8      */
     9     public static boolean generateImage(String imgStr, String path) {
    10         if (StringUtils.isBlank(imgStr)) {
    11             return false;
    12         }
    13         BASE64Decoder decoder = new BASE64Decoder();
    14         try {
    15             // 解密
    16             byte[] b = decoder.decodeBuffer(imgStr);
    17             // 处理数据
    18             for (int i = 0; i < b.length; ++i) {
    19                 if (b[i] < 0) {
    20                     b[i] += 256;
    21                 }
    22             }
    23             OutputStream out = new FileOutputStream(path);
    24             out.write(b);
    25             out.flush();
    26             out.close();
    27             return true;
    28         } catch (Exception e) {
    29             e.printStackTrace();
    30         }
    31         return false;
    32     }
    33 
    34     /**
    35      * @Description: 根据图片地址转换为base64编码字符串
    36      * @return
    37      */
    38     public static String getImageStr(String imgFile) {
    39         InputStream inputStream = null;
    40         byte[] data = null;
    41         try {
    42             inputStream = new FileInputStream(imgFile);
    43             data = new byte[inputStream.available()];
    44             inputStream.read(data);
    45             inputStream.close();
    46         } catch (IOException e) {
    47             e.printStackTrace();
    48         }
    49         // 加密
    50         BASE64Encoder encoder = new BASE64Encoder();
    51         return encoder.encode(data);
    52     }

    Base64的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder的sun.misc.BASE64Encoder/BASE64Decoder类。这个类是sun公司的内部方法,并没有在java api中公开过,不属于JDK标准库范畴,但在JDK中包含了该类,可以直接使用。但是在Eclipse和MyEclipse中直接使用,却找不到该类。解决方法如下:

    1.右键项目--》Build Path --》Configure Build Path

    选择Libraries,点击JRE System Library,选择 Access rules,如果之前没有定义规则,会显示No rules defined

    2. Access rules,点击Edit --》Add,然后点击Ok

    3.在Resolution下拉列表框中选择Accessible,Rule Pattern 选择**,依次点击ok

    /**
         * @Description:图片拼接 (注意:必须两张图片长宽一致哦)
         * @param files
         *            要拼接的文件列表
         * @param type
         *            1横向拼接, 2 纵向拼接
         */
        public static boolean mergeImage(String[] files, int type, String targetFile) {
            int len = files.length;
            if (len < 1) {
                throw new RuntimeException("图片数量小于1");
            }
            File[] src = new File[len];
            BufferedImage[] images = new BufferedImage[len];
            int[][] ImageArrays = new int[len][];
            for (int i = 0; i < len; i++) {
                try {
                    src[i] = new File(files[i]);
                    images[i] = ImageIO.read(src[i]);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                int width = images[i].getWidth();
                int height = images[i].getHeight();
                ImageArrays[i] = new int[width * height];
                ImageArrays[i] = images[i].getRGB(0, 0, width, height, ImageArrays[i], 0, width);
            }
            int newHeight = 0;
            int newWidth = 0;
            for (int i = 0; i < images.length; i++) {
                // 横向
                if (type == 1) {
                    newHeight = newHeight > images[i].getHeight() ? newHeight : images[i].getHeight();
                    newWidth += images[i].getWidth();
                } else if (type == 2) {// 纵向
                    newWidth = newWidth > images[i].getWidth() ? newWidth : images[i].getWidth();
                    newHeight += images[i].getHeight();
                }
            }
            if (type == 1 && newWidth < 1) {
                return false;
            }
            if (type == 2 && newHeight < 1) {
                return false;
            }
    
            // 生成新图片
            try {
                BufferedImage ImageNew = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
                int height_i = 0;
                int width_i = 0;
                for (int i = 0; i < images.length; i++) {
                    if (type == 1) {
                        ImageNew.setRGB(width_i, 0, images[i].getWidth(), newHeight, ImageArrays[i], 0,
                                images[i].getWidth());
                        width_i += images[i].getWidth();
                    } else if (type == 2) {
                        ImageNew.setRGB(0, height_i, newWidth, images[i].getHeight(), ImageArrays[i], 0, newWidth);
                        height_i += images[i].getHeight();
                    }
                }
                // 输出想要的图片
                ImageIO.write(ImageNew, targetFile.split("\.")[1], new File(targetFile));
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    /**
         * @param srcImgPath
         *            源图片路径
         * @param tarImgPath
         *            保存的图片路径
         * @param waterMarkContent
         *            水印内容
         * @param markContentColor
         *            水印颜色
         * @param font
         *            水印字体
         */
        public boolean addWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent, Color markContentColor,
                Font font, int degree) {
            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);
                g.setColor(markContentColor); // 根据图片的背景设置水印颜色
                g.setFont(font); // 设置字体
                // 设置水印的坐标
                int x = srcImgWidth - 2 * getWatermarkLength(waterMarkContent, g);
                int y = srcImgHeight - 2 * getWatermarkLength(waterMarkContent, g);
                g.rotate(Math.toRadians(degree), (double) srcImgWidth / 2, (double) srcImgHeight / 2);
                float high = (float) (1648 / 3.7);
                for (int i = 0; i < 9; i++) {
                    if (i % 2 == 0) {
                        g.drawString(waterMarkContent, 0.0f - 500, i * high); // 画出水印
                    } else {
                        g.drawString(waterMarkContent, 0.0f, i * high); // 画出水印
                    }
                }
                g.dispose();
                // 输出图片
                FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
                ImageIO.write(bufImg, "jpg", outImgStream);
                System.out.println("添加水印完成");
                outImgStream.flush();
                outImgStream.close();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    
        public int getWatermarkLength(String waterMarkContent, Graphics2D g) {
            return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
        }
        
        public static void main(String[] args) {
            Font font = new Font("微软雅黑", Font.BOLD, 150); // 水印字体
            String srcImgPath = "d:/demo.jpg"; // 源图片地址
            String tarImgPath = "d:/test1.jpg"; // 待存储的地址
            String waterMarkContent = "本照片仅供行邮商品报关使用          本照片仅供行邮商品报关使用"; // 水印内容
            Color color = new Color(0, 0, 0, 50); // 水印图片色彩以及透明度
            addWaterMark(srcImgPath, tarImgPath, waterMarkContent, color, font, 330);
        }
  • 相关阅读:
    Linux——k8s命令别名修改
    k8s—centos7安装部署NFS服务器和客户端及基于nfs的动态存储storageclass使用总结
    MySQL—用户和权限管控
    MySQL—常用SQL语句整理总结
    Zookeeper——入门介绍(相关原理、安装启动及使用操作)
    SpringBoot——Quartz定时框架的使用详解和总结
    SpringBoot——@Scheduled的自定义周期性线程池解决任务延时执行问题
    Linux—用户新建目录和文件的默认权限设置:umask详解
    设计模式——单例模式详解
    Linux—CPU核数、上下文切换介绍及pidstat等命令详解
  • 原文地址:https://www.cnblogs.com/jinloooong/p/9006514.html
Copyright © 2020-2023  润新知