将二维码和背景图片拼装成新的分享图片

/**
 * @ClassName: QrCodeServiceImpl
 * @Description:操作图片
 * @Author guoh
 * @Date 2018/8/9 13:29
 */
@Service
public class QrCodeServiceImpl implements QrCodeService {

    private Logger logger = LoggerFactory.getLogger(QrCodeServiceImpl.class);

    public static final Integer QR_CODE_WIDTH = 204; //二维码宽度
    public static final Integer QR_CODE_HEIGHT = 204;// 二维码高度
    public static final Integer OR_YELLOW_COLOR = 0xFF6600;// 黄色
    public static final Integer OR_WHITE_COLOR = 0xFFFFFFFF;// 白色


    /**
     * 将二维码和背景图片拼装成新的分享图片
     * @param shareContent  生成二维码内容
     * @param bgPicturePath 背景图片地址
     * @return base64 String 的图片
     */
    @Override
    public String createBase64Image(String shareContent, String bgPicturePath) {
        try {
            logger.info("begin to create base64 image shareContent:{}",shareContent);

            // 1.1 生成二维码图片
            BufferedImage qrCodeImage = createQrImage(shareContent, QR_CODE_WIDTH, QR_CODE_HEIGHT);

            // 1.2 读取并生成背景图片
            Image bgImage = ImageIO.read(new FileInputStream(bgPicturePath));
            BufferedImage bgPicture = new BufferedImage(bgImage.getWidth(null), bgImage.getHeight(null), BufferedImage.TYPE_INT_RGB);

            // 1.3 将二维码拼接背景图片
            Graphics2D g = bgPicture.createGraphics();
            g.drawImage(bgImage, 0, 0, null);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1));
            int starX = bgImage.getWidth(null)*275/750;// 二维码距背景图片X轴距离
            int startY = bgImage.getHeight(null)*990/1405;// 二维码距背景图片Y轴距离
            g.drawImage(qrCodeImage, starX, startY, qrCodeImage.getWidth(null), qrCodeImage.getHeight(null), null);
            g.dispose();

            // 1.4 将合成的图片转为base64String
            ByteArrayOutputStream compositeImageByte = new ByteArrayOutputStream();
            ImageIO.write(bgPicture, "png", compositeImageByte);
            String pngBase64 =  new BASE64Encoder().encodeBuffer(compositeImageByte.toByteArray()).trim();//转换成base64串
            pngBase64 = "data:image/png;base64," + pngBase64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n

            logger.info("create base64 image success");
            return pngBase64;
        } catch (Exception e) {
            logger.info("create base64 image error",e);
            return null;
        }
    }

    /**
     * 生成二维码图片
     * @param shareContent 生成二维码分享内容
     * @param qrCodeWidth 维码宽度
     * @param qrCodeHeight 二维码高度
     * @return 二维码图片【ImageIO.write方法可将图片保存到本地】
     */
    @Override
    public BufferedImage createQrImage(String shareContent, int qrCodeWidth, int qrCodeHeight) {
        logger.info("begin to create qrImage shareContent:{}",shareContent);

        // 用于设置QR二维码参数
        Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
        // 设置QR二维码的纠错级别——这里选择最高H级别
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 设置编码方式
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        // 使用EncodeHintType.MARGIN设置二维码空白区域大小
        hints.put(EncodeHintType.MARGIN, 1);
        // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度
        BitMatrix bitMatrix;
        try {
            bitMatrix = new MultiFormatWriter().encode(shareContent, BarcodeFormat.QR_CODE, qrCodeWidth, qrCodeHeight, hints);
        } catch (WriterException e) {
            logger.info("create qrImage error",e);
            return null;
        }
        // 创建一个不带透明色的BufferedImage对象
        BufferedImage image = new BufferedImage(bitMatrix.getWidth(), bitMatrix.getHeight(), BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < bitMatrix.getWidth(); x++) {
            for (int y = 0; y < bitMatrix.getHeight(); y++) {
                // 开始利用二维码数据,分别设为黄0xFF6600和白0xFFFFFFFF两色
                image.setRGB(x, y, bitMatrix.get(x, y) ? OR_YELLOW_COLOR : OR_WHITE_COLOR);
            }
        }
        logger.info("create qrImage success");
        return image;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您可以使用 iText 库来完成 Java 中的图片和 PDF 拼接。以下是一个简单的示例代码: ```java import com.itextpdf.text.Document; import com.itextpdf.text.Image; import com.itextpdf.text.pdf.PdfCopy; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfWriter; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; public class PdfMergeExample { public static void main(String[] args) { try { // 输入的 pdf 文件路径 String inputFile1 = "input1.pdf"; String inputFile2 = "input2.pdf"; String outputFile = "output.pdf"; // 创建一个 Document 对象 Document document = new Document(); // 创建一个 PdfCopy 对象 PdfCopy copy = new PdfCopy(document, new FileOutputStream(outputFile)); // 打开 Document document.open(); // 读取第一个 pdf 文件 PdfReader reader1 = new PdfReader(inputFile1); int pageCount1 = reader1.getNumberOfPages(); // 读取第二个 pdf 文件 PdfReader reader2 = new PdfReader(inputFile2); int pageCount2 = reader2.getNumberOfPages(); // 将第一个 pdf 文件的所有页面添到新的 pdf 文件中 for (int i = 1; i <= pageCount1; i++) { copy.addPage(copy.getImportedPage(reader1, i)); } // 将第二个 pdf 文件的所有页面添到新的 pdf 文件中 for (int i = 1; i <= pageCount2; i++) { copy.addPage(copy.getImportedPage(reader2, i)); } // 关闭 PdfReader 和 Document reader1.close(); reader2.close(); document.close(); System.out.println("PDF 文件合并完成!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 如果您需要添图片,可以使用 Image 类来添图片。以下是一个简单的示例代码: ```java // 创建一个 Image 对象 Image image = Image.getInstance("image.jpg"); // 添到新的 pdf 文件中 document.add(image); ``` 您可以根据需要修改代码来满足您的需求。希望对您有帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值