您的当前位置:首页正文

java实现两张png图片合并(重叠)成一张图片

来源:筏尚旅游网
/**
 * @date: 2023/4/16 15:01
 * @Description:
 */
public class ImgUtils {

    /***
     * @Date: 2023/4/16 15:13
     * @Description  将签字 和 指纹 的png图片合成一张
     * @param qzBase64 签字base64
     * @param zwBase64  指纹base64
     **/
    public static String hbImg(String qzBase64,String zwBase64){
        String result = "";

        if (!StringHelper.isEmpty(qzBase64) & !StringHelper.isEmpty(zwBase64)){

            try {

                byte[] qzBytes = new BASE64Decoder().decodeBuffer(qzBase64);
                byte[] zwBytes = new BASE64Decoder().decodeBuffer(zwBase64);

                // 设置图片大小
                BufferedImage qzImg = resizeImagePng(256, 256, ImageIO.read(new ByteArrayInputStream(qzBytes)));
                BufferedImage zwImg = resizeImagePng(256, 256, ImageIO.read(new ByteArrayInputStream(zwBytes)));

                // 创建背景画布
                BufferedImage background = new BufferedImage(qzImg.getWidth(), qzImg.getHeight(), BufferedImage.TYPE_INT_RGB);

                // 设置背景色
                Graphics2D g2d = background.createGraphics();
                // 设置背景颜色
                g2d.setColor(Color.WHITE);
                // 填充
                g2d.fillRect(0, 0, background.getWidth(), background.getHeight());
                g2d.drawImage(qzImg, 0, 0, null);
                g2d.dispose();

                // 指纹写入
                Graphics2D graphics = background.createGraphics();
                // 设置图片透明度
                graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,1.0f));
                graphics.drawImage(zwImg,0,0,zwImg.getWidth(), zwImg.getHeight(),null);
                graphics.dispose();

                // 取掉白色背景  设置为透明图片
                ImageIcon imageIcon = new ImageIcon(background);
                BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(),
                        BufferedImage.TYPE_4BYTE_ABGR);
                Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
                g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());
                int alpha = 0;
                for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
                    for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
                        int rgb = bufferedImage.getRGB(j2, j1);
                        int R = (rgb & 0xff0000) >> 16;
                        int G = (rgb & 0xff00) >> 8;
                        int B = (rgb & 0xff);
                        if (((255 - R) < 30) && ((255 - G) < 30) && ((255 - B) < 30)) {
                            rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
                        }
                        bufferedImage.setRGB(j2, j1, rgb);
                    }
                }
                g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());

                // 输出流
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

                ImageIO.write(bufferedImage, "png", outputStream);

                // 将合成图片转成base64返回
                result = new BASE64Encoder().encode(outputStream.toByteArray());

            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return result;
    }

    /***
     * @Date: 2023/4/16 15:14
     * @Description  设置图片的大小
     * @param x  width
     * @param y height
     * @param bfi
     **/
    public static BufferedImage resizeImagePng(int x, int y, BufferedImage bfi) {
        BufferedImage bufferedImage = new BufferedImage(x, y, BufferedImage.TYPE_INT_ARGB);
        bufferedImage.getGraphics().drawImage(
                bfi.getScaledInstance(x, y, Image.SCALE_SMOOTH), 0, 0, null);
        return bufferedImage;
    }
}

因篇幅问题不能全部显示,请点此查看更多更全内容