使用zxing生成二维码保存问题

evanosc 2017-01-13 11:35:37
最近一个项目里用到了登陆页面显示二维码,我就用zxing做了一个生成二维码的方法,可是zxing生成的二维码是一张图片,直接配置了一个imasavepath,还必须填写物理路径。我就把写死成tomcat路径下的upload文件夹,可是部署在服务器上的时候,服务器的tomcat目录下的东西是不能访问的,导致图片的地址拿不到,现在问题就是,保存图片的路径时候写死了他就无法映射文件,用虚拟路径zxing就无法生成图片!想知道用过的大神都是怎么处理的
更多 分
...全文
227 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bcsflilong 2017-01-18
  • 打赏
  • 举报
回复
引用 2 楼 evanosc 的回复:
[quote=引用 1 楼 bcsflilong 的回复:] 生成的二维码 不用直接生成文件 反正是给页面展示用的 你直接将它包装成一个inputstream 下面是我自己用的一个生成二维码的一套程序 我返回的二维码都放入了byte[]中 (因为我要入库) 你用我的这段 将byte[]包装到inputstream中就可以了
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.bcsfll.postman.mail.utility;

import com.swetake.util.Qrcode;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import org.bcsfll.postman.base.utility.ConfigUtil;

/**
 *
 * @author Tone
 */
public class QRCodeUtils {

    public static byte[] createQrCode(String codeData) {
        Qrcode qrcode = new Qrcode();
        qrcode.setQrcodeErrorCorrect('M');  // 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关  
        qrcode.setQrcodeEncodeMode('B');
        qrcode.setQrcodeVersion(7);     // 设置Qrcode包的版本  

        BufferedImage bufferedImage = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        codeData = ConfigUtil.getInstance().getValueByKey("qr.url") + codeData;
        try {
            byte[] codeBytes = codeData.getBytes("UTF-8"); // 字符集 
            bufferedImage = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
            // createGraphics   // 创建图层  
            Graphics2D graphics2D = bufferedImage.createGraphics();

            graphics2D.setBackground(Color.WHITE);   // 设置背景颜色(白色)  
            graphics2D.clearRect(0, 0, 140, 140);    // 矩形 X、Y、width、height  
            graphics2D.setColor(Color.BLACK);    // 设置图像颜色(黑色)  

            if (codeBytes.length > 0 && codeBytes.length < 120) {
                boolean[][] b = qrcode.calQrcode(codeBytes);
                for (int i = 0; i < b.length; i++) {
                    for (int j = 0; j < b.length; j++) {
                        if (b[j][i]) {
                            graphics2D.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
                        }
                    }
                }
            }
            
            
            graphics2D.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象  
            bufferedImage.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源  
            byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
            return byteArrayOutputStream.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

        }
        return null;



    }

    public static byte[] changePicSize(InputStream inputStream) {
        int new_w = 40;     //输出的图片宽度
        int new_h = 40;    //输出的图片高度

        //图片字节数组返回流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        Image image = null;
       // Toolkit toolkit = Toolkit.getDefaultToolkit();
        Applet applet = new Applet();
        MediaTracker mediaTracker = new MediaTracker(applet);
        try {
          //  image = toolkit.getImage(path);//读取图片
            image=ImageIO.read(inputStream);
            mediaTracker.addImage(image, 0);
            mediaTracker.waitForID(0);
        } catch (Exception e) {
            
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, e);
        }

        if (image.getWidth(null) == -1) {
            //System.out.println("   can't read,retry!" + "<BR>");
            return null;
        } else {
            BufferedImage bufferedImage = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
            Graphics graphics = bufferedImage.createGraphics();
            graphics.setColor(Color.white);
            graphics.fillRect(0, 0, new_w, new_h);
            graphics.drawImage(image, 0, 0, new_w, new_h, null);
            graphics.dispose();

            try {
                ImageIO.write(bufferedImage, "JPEG", byteArrayOutputStream);
            } catch (IOException e) {
                Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, e);
            }
        }
        return byteArrayOutputStream.toByteArray();
    }
    public static byte[] createQrCode(String codeData, InputStream inputStream) {
        Qrcode qrcode = new Qrcode();
        qrcode.setQrcodeErrorCorrect('M');  // 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关  
        qrcode.setQrcodeEncodeMode('B');
        qrcode.setQrcodeVersion(7);     // 设置Qrcode包的版本  

        BufferedImage bufferedImage = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        codeData = ConfigUtil.getInstance().getValueByKey("qr.url") + codeData;
        try {
            byte[] codeBytes = codeData.getBytes("UTF-8"); // 字符集 
            bufferedImage = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
            // createGraphics   // 创建图层  
            Graphics2D graphics2D = bufferedImage.createGraphics();

            graphics2D.setBackground(Color.WHITE);   // 设置背景颜色(白色)  
            graphics2D.clearRect(0, 0, 140, 140);    // 矩形 X、Y、width、height  
            graphics2D.setColor(Color.BLACK);    // 设置图像颜色(黑色)  

            if (codeBytes.length > 0 && codeBytes.length < 120) {
                boolean[][] b = qrcode.calQrcode(codeBytes);
                for (int i = 0; i < b.length; i++) {
                    for (int j = 0; j < b.length; j++) {
                        if (b[j][i]) {
                            graphics2D.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
                        }
                    }
                }
            }
            //读取头像图片,调整图片大小。
            byte[] bytes = changePicSize(inputStream);
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
            BufferedImage bufferedImage_Logo = ImageIO.read(byteArrayInputStream);
            graphics2D.drawImage(bufferedImage_Logo, 50, 50, null);
            
            graphics2D.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象  
            bufferedImage.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源  
            byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
            return byteArrayOutputStream.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

        }
        return null;



    }

   
}
虽然最后我还是吧路径写死了,通过user.dir的方式获取的绝对路径,然后截取替换后将生成的图片保存在项目路径下,这样的问题就是以后部署到正式服务器就要复制测试服务器的图片了 不过还是谢谢哥们的回答 [/quote]我都喜欢把图片入库, 其实我是喜欢把一切入库,虽然数据效率会低 但是维护成本低
evanosc 2017-01-17
  • 打赏
  • 举报
回复
引用 1 楼 bcsflilong 的回复:
生成的二维码 不用直接生成文件 反正是给页面展示用的 你直接将它包装成一个inputstream 下面是我自己用的一个生成二维码的一套程序 我返回的二维码都放入了byte[]中 (因为我要入库) 你用我的这段 将byte[]包装到inputstream中就可以了
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.bcsfll.postman.mail.utility;

import com.swetake.util.Qrcode;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import org.bcsfll.postman.base.utility.ConfigUtil;

/**
 *
 * @author Tone
 */
public class QRCodeUtils {

    public static byte[] createQrCode(String codeData) {
        Qrcode qrcode = new Qrcode();
        qrcode.setQrcodeErrorCorrect('M');  // 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关  
        qrcode.setQrcodeEncodeMode('B');
        qrcode.setQrcodeVersion(7);     // 设置Qrcode包的版本  

        BufferedImage bufferedImage = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        codeData = ConfigUtil.getInstance().getValueByKey("qr.url") + codeData;
        try {
            byte[] codeBytes = codeData.getBytes("UTF-8"); // 字符集 
            bufferedImage = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
            // createGraphics   // 创建图层  
            Graphics2D graphics2D = bufferedImage.createGraphics();

            graphics2D.setBackground(Color.WHITE);   // 设置背景颜色(白色)  
            graphics2D.clearRect(0, 0, 140, 140);    // 矩形 X、Y、width、height  
            graphics2D.setColor(Color.BLACK);    // 设置图像颜色(黑色)  

            if (codeBytes.length > 0 && codeBytes.length < 120) {
                boolean[][] b = qrcode.calQrcode(codeBytes);
                for (int i = 0; i < b.length; i++) {
                    for (int j = 0; j < b.length; j++) {
                        if (b[j][i]) {
                            graphics2D.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
                        }
                    }
                }
            }
            
            
            graphics2D.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象  
            bufferedImage.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源  
            byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
            return byteArrayOutputStream.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

        }
        return null;



    }

    public static byte[] changePicSize(InputStream inputStream) {
        int new_w = 40;     //输出的图片宽度
        int new_h = 40;    //输出的图片高度

        //图片字节数组返回流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        Image image = null;
       // Toolkit toolkit = Toolkit.getDefaultToolkit();
        Applet applet = new Applet();
        MediaTracker mediaTracker = new MediaTracker(applet);
        try {
          //  image = toolkit.getImage(path);//读取图片
            image=ImageIO.read(inputStream);
            mediaTracker.addImage(image, 0);
            mediaTracker.waitForID(0);
        } catch (Exception e) {
            
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, e);
        }

        if (image.getWidth(null) == -1) {
            //System.out.println("   can't read,retry!" + "<BR>");
            return null;
        } else {
            BufferedImage bufferedImage = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
            Graphics graphics = bufferedImage.createGraphics();
            graphics.setColor(Color.white);
            graphics.fillRect(0, 0, new_w, new_h);
            graphics.drawImage(image, 0, 0, new_w, new_h, null);
            graphics.dispose();

            try {
                ImageIO.write(bufferedImage, "JPEG", byteArrayOutputStream);
            } catch (IOException e) {
                Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, e);
            }
        }
        return byteArrayOutputStream.toByteArray();
    }
    public static byte[] createQrCode(String codeData, InputStream inputStream) {
        Qrcode qrcode = new Qrcode();
        qrcode.setQrcodeErrorCorrect('M');  // 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关  
        qrcode.setQrcodeEncodeMode('B');
        qrcode.setQrcodeVersion(7);     // 设置Qrcode包的版本  

        BufferedImage bufferedImage = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        codeData = ConfigUtil.getInstance().getValueByKey("qr.url") + codeData;
        try {
            byte[] codeBytes = codeData.getBytes("UTF-8"); // 字符集 
            bufferedImage = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
            // createGraphics   // 创建图层  
            Graphics2D graphics2D = bufferedImage.createGraphics();

            graphics2D.setBackground(Color.WHITE);   // 设置背景颜色(白色)  
            graphics2D.clearRect(0, 0, 140, 140);    // 矩形 X、Y、width、height  
            graphics2D.setColor(Color.BLACK);    // 设置图像颜色(黑色)  

            if (codeBytes.length > 0 && codeBytes.length < 120) {
                boolean[][] b = qrcode.calQrcode(codeBytes);
                for (int i = 0; i < b.length; i++) {
                    for (int j = 0; j < b.length; j++) {
                        if (b[j][i]) {
                            graphics2D.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
                        }
                    }
                }
            }
            //读取头像图片,调整图片大小。
            byte[] bytes = changePicSize(inputStream);
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
            BufferedImage bufferedImage_Logo = ImageIO.read(byteArrayInputStream);
            graphics2D.drawImage(bufferedImage_Logo, 50, 50, null);
            
            graphics2D.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象  
            bufferedImage.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源  
            byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
            return byteArrayOutputStream.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

        }
        return null;



    }

   
}
虽然最后我还是吧路径写死了,通过user.dir的方式获取的绝对路径,然后截取替换后将生成的图片保存在项目路径下,这样的问题就是以后部署到正式服务器就要复制测试服务器的图片了 不过还是谢谢哥们的回答
bcsflilong 2017-01-13
  • 打赏
  • 举报
回复
生成的二维码 不用直接生成文件 反正是给页面展示用的 你直接将它包装成一个inputstream 下面是我自己用的一个生成二维码的一套程序 我返回的二维码都放入了byte[]中 (因为我要入库) 你用我的这段 将byte[]包装到inputstream中就可以了
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.bcsfll.postman.mail.utility;

import com.swetake.util.Qrcode;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import org.bcsfll.postman.base.utility.ConfigUtil;

/**
 *
 * @author Tone
 */
public class QRCodeUtils {

    public static byte[] createQrCode(String codeData) {
        Qrcode qrcode = new Qrcode();
        qrcode.setQrcodeErrorCorrect('M');  // 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关  
        qrcode.setQrcodeEncodeMode('B');
        qrcode.setQrcodeVersion(7);     // 设置Qrcode包的版本  

        BufferedImage bufferedImage = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        codeData = ConfigUtil.getInstance().getValueByKey("qr.url") + codeData;
        try {
            byte[] codeBytes = codeData.getBytes("UTF-8"); // 字符集 
            bufferedImage = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
            // createGraphics   // 创建图层  
            Graphics2D graphics2D = bufferedImage.createGraphics();

            graphics2D.setBackground(Color.WHITE);   // 设置背景颜色(白色)  
            graphics2D.clearRect(0, 0, 140, 140);    // 矩形 X、Y、width、height  
            graphics2D.setColor(Color.BLACK);    // 设置图像颜色(黑色)  

            if (codeBytes.length > 0 && codeBytes.length < 120) {
                boolean[][] b = qrcode.calQrcode(codeBytes);
                for (int i = 0; i < b.length; i++) {
                    for (int j = 0; j < b.length; j++) {
                        if (b[j][i]) {
                            graphics2D.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
                        }
                    }
                }
            }
            
            
            graphics2D.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象  
            bufferedImage.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源  
            byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
            return byteArrayOutputStream.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

        }
        return null;



    }

    public static byte[] changePicSize(InputStream inputStream) {
        int new_w = 40;     //输出的图片宽度
        int new_h = 40;    //输出的图片高度

        //图片字节数组返回流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        Image image = null;
       // Toolkit toolkit = Toolkit.getDefaultToolkit();
        Applet applet = new Applet();
        MediaTracker mediaTracker = new MediaTracker(applet);
        try {
          //  image = toolkit.getImage(path);//读取图片
            image=ImageIO.read(inputStream);
            mediaTracker.addImage(image, 0);
            mediaTracker.waitForID(0);
        } catch (Exception e) {
            
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, e);
        }

        if (image.getWidth(null) == -1) {
            //System.out.println("   can't read,retry!" + "<BR>");
            return null;
        } else {
            BufferedImage bufferedImage = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
            Graphics graphics = bufferedImage.createGraphics();
            graphics.setColor(Color.white);
            graphics.fillRect(0, 0, new_w, new_h);
            graphics.drawImage(image, 0, 0, new_w, new_h, null);
            graphics.dispose();

            try {
                ImageIO.write(bufferedImage, "JPEG", byteArrayOutputStream);
            } catch (IOException e) {
                Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, e);
            }
        }
        return byteArrayOutputStream.toByteArray();
    }
    public static byte[] createQrCode(String codeData, InputStream inputStream) {
        Qrcode qrcode = new Qrcode();
        qrcode.setQrcodeErrorCorrect('M');  // 纠错级别(L 7%、M 15%、Q 25%、H 30%)和版本有关  
        qrcode.setQrcodeEncodeMode('B');
        qrcode.setQrcodeVersion(7);     // 设置Qrcode包的版本  

        BufferedImage bufferedImage = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        codeData = ConfigUtil.getInstance().getValueByKey("qr.url") + codeData;
        try {
            byte[] codeBytes = codeData.getBytes("UTF-8"); // 字符集 
            bufferedImage = new BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);
            // createGraphics   // 创建图层  
            Graphics2D graphics2D = bufferedImage.createGraphics();

            graphics2D.setBackground(Color.WHITE);   // 设置背景颜色(白色)  
            graphics2D.clearRect(0, 0, 140, 140);    // 矩形 X、Y、width、height  
            graphics2D.setColor(Color.BLACK);    // 设置图像颜色(黑色)  

            if (codeBytes.length > 0 && codeBytes.length < 120) {
                boolean[][] b = qrcode.calQrcode(codeBytes);
                for (int i = 0; i < b.length; i++) {
                    for (int j = 0; j < b.length; j++) {
                        if (b[j][i]) {
                            graphics2D.fillRect(j * 3 + 2, i * 3 + 2, 3, 3);
                        }
                    }
                }
            }
            //读取头像图片,调整图片大小。
            byte[] bytes = changePicSize(inputStream);
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
            BufferedImage bufferedImage_Logo = ImageIO.read(byteArrayInputStream);
            graphics2D.drawImage(bufferedImage_Logo, 50, 50, null);
            
            graphics2D.dispose(); // 释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象  
            bufferedImage.flush(); // 刷新此 Image 对象正在使用的所有可重构的资源  
            byteArrayOutputStream = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", byteArrayOutputStream);
            return byteArrayOutputStream.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(QRCodeUtils.class.getName()).log(Level.SEVERE, null, ex);

        }
        return null;



    }

   
}

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧