二维码中添加图片

com.jfinal.render;

com.google.zxing.BarcodeFormat;
com.google.zxing.EncodeHintType;
com.google.zxing.MultiFormatWriter;
com.google.zxing.WriterException;
com.google.zxing.client.j2se.MatrixToImageWriter;
com.google.zxing.common.BitMatrix;
com.google.zxing.qrcode.QRCodeWriter;
com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
com.jfinal.kit.StrKit;
sun.misc.IOUtils;
sun.nio.ch.IOUtil;

javax.imageio.ImageIO;
javax.servlet.ServletOutputStream;
java.awt.*;
java.awt.image.BufferedImage;
java.io.ByteArrayInputStream;
java.io.ByteArrayOutputStream;
java.io.File;
java.io.InputStream;
java.util.HashMap;
java.util.Map;

QRImageRender Render {

    = ;   = ;   ErrorCorrectionLevel ; String ;   ;        ;       File ;        String ;QRImageRender(String content, width, height,File file) {
        init(content, width, height, ,file,);
    }

    QRImageRender(String content, width, height,File file,String bottomContent) {
        init(content, width, height, ,file,bottomContent);
    }

    init(String content, width, height, ErrorCorrectionLevel errorCorrectionLevel,File file,String bottomContent) {
        (StrKit.(content)) {
            IllegalArgumentException();
        }
        (width < || height < ) {
            IllegalArgumentException();
        }
        (file==||!file.exists ()||file.isDirectory ()){
            IllegalArgumentException();
        }
        .= content;
        .= width;
        .= height;
        .= errorCorrectionLevel;
        .=file;
        (bottomContent==||bottomContent.isEmpty ()){
            .=;
        }{
            .=bottomContent;
        }
    }
    render() {
        .setHeader(,);
        .setHeader(,);
        .setDateHeader(, );
        .setContentType();
        {
            BufferedImage bim = getQR_CODEBufferedImage(, BarcodeFormat., , , getDecodeHintType());
            InputStream inputStream=addLogo_QRCode(bim, File(.getPath ()), LogoConfig(), ,,);
            len=;
            [] data=[];
            ServletOutputStream sos=.getOutputStream ();
            {
                ((len=inputStream.read ( data ))!=-){
                    sos.write (data,,len);
                }
            }(Exception e){
                 RenderException ( );
            }{
               (sos!=){
                   sos.close ();
               }
               (inputStream!=){
                   inputStream.close ();
               }
            }
        }(Exception e){
            RenderException(e);
        }
    }

    InputStream addLogo_QRCode(BufferedImage bim, File logoPic, LogoConfig logoConfig, String productName, width, height)
    {
        {
            BufferedImage image = bim;
            Graphics2D g = image.createGraphics();

            BufferedImage logo = ImageIO.(logoPic);
            widthLogo = logo.getWidth()>image.getWidth()*/?(image.getWidth()*/):logo.getWidth(),
                    heightLogo = logo.getHeight()>image.getHeight()*/?(image.getHeight()*/):logo.getWidth();

            x = (image.getWidth() - widthLogo) / ;
            y = (image.getHeight() - heightLogo) / ;
            g.drawImage(logo, x, y, widthLogo, heightLogo, );
g.dispose();

            (productName != && !productName.equals()) {
                BufferedImage outImage = BufferedImage(width, height+, BufferedImage.);
                Graphics2D outg = outImage.createGraphics();
                outg.drawImage(image, , , image.getWidth(), image.getHeight(), );
                outg.setColor(Color.);
                outg.setFont(Font(,Font.,)); strWidth = outg.getFontMetrics().stringWidth(productName);
                (strWidth > ) {
String productName1 = productName.substring(, productName.length()/);
                    String productName2 = productName.substring(productName.length()/, productName.length());
                    strWidth1 = outg.getFontMetrics().stringWidth(productName1);
                    strWidth2 = outg.getFontMetrics().stringWidth(productName2);
                    outg.drawString(productName1,  strWidth1/, image.getHeight() + (outImage.getHeight() - image.getHeight())/+ );
                    BufferedImage outImage2 = BufferedImage(width, height+, BufferedImage.);
                    Graphics2D outg2 = outImage2.createGraphics();
                    outg2.drawImage(outImage, , , outImage.getWidth(), outImage.getHeight(), );
                    outg2.setColor(Color.);
                    outg2.setFont(Font(,Font.,)); outg2.drawString(productName2, strWidth2/, outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight())/+ );
                    outg2.dispose();
                    outImage2.flush();
                    outImage = outImage2;
                }{
                    outg.drawString(productName,  (width-strWidth+)/, image.getHeight() + (outImage.getHeight() - image.getHeight())/+ ); }
                outg.dispose();
                outImage.flush();
                image = outImage;
            }
            logo.flush();
            image.flush();
            ByteArrayOutputStream baos = ByteArrayOutputStream();
ImageIO.(image, , baos);
            InputStream is = ByteArrayInputStream (baos.toByteArray());
            is;
        }
        (Exception e)
        {
            e.printStackTrace();
        }
        ;
    }


    BufferedImage fileToBufferedImage(BitMatrix bm)
    {
        BufferedImage image = ;
        {
            w = bm.getWidth(), h = bm.getHeight();
            image = BufferedImage(w, h, BufferedImage.);

            (x = ; x < w; x++)
            {
                (y = ; y < h; y++)
                {
                    image.setRGB(x, y, bm.get(x, y) ? : );
                }
            }

        }
        (Exception e)
        {
            e.printStackTrace();
        }
        image;
    }

    BufferedImage getQR_CODEBufferedImage(String content, BarcodeFormat barcodeFormat, width, height, Map<EncodeHintType, ?> hints)
    {
        MultiFormatWriter multiFormatWriter = ;
        BitMatrix bm = ;
        BufferedImage image = ;
        {
            multiFormatWriter = MultiFormatWriter();
            bm = multiFormatWriter.encode(content, barcodeFormat, width, height, hints);
            w = bm.getWidth();
            h = bm.getHeight();
            image = BufferedImage(w, h, BufferedImage.);

            (x = ; x < w; x++)
            {
                (y = ; y < h; y++)
                {
                    image.setRGB(x, y, bm.get(x, y) ? : );
                }
            }
        }
        (WriterException e)
        {
            e.printStackTrace();
        }
        image;
    }

    Map<EncodeHintType, Object> getDecodeHintType()
    {
        Map<EncodeHintType, Object> hints = HashMap<EncodeHintType, Object> ();
        hints.put(EncodeHintType., ErrorCorrectionLevel.);
        hints.put(EncodeHintType., );
        hints.put(EncodeHintType., );
        hints.put(EncodeHintType., );
        hints.put(EncodeHintType., );
        hints;
    }
}

LogoConfig
{
    Color = Color.;
    = ;
    = ;

    = ;
    Color ;
    ;


    LogoConfig()
    {
        (, );
    }

    LogoConfig(Color borderColor, logoPart)
    {
        .= borderColor;
        .= logoPart;
    }

    Color getBorderColor()
    {
        ;
    }

    getBorder()
    {
        ;
    }

    getLogoPart()
    {
        ;
    }
}


评论区

1040110333

2017-09-22 19:02

使用方法 render ( new QRImageRender("nihao",300,300,new File("C://zfile/0011f1ac-fa03-4795-8d54-0698869a10e0.jpg")) );

l745230

2017-09-24 14:02

提个建议,除了支持本地图片,还能支持下http图片,我觉得后者的应用场景更广,而且能跟oss配合

1040110333

2017-09-24 14:40

@l745230 这个可以做成二维码生成器,原理现在也简单

热门分享

扫码入社