1. 程式人生 > >JAVA 資料庫讀取blob(圖片)合成多張圖 基於Struts2和Spring

JAVA 資料庫讀取blob(圖片)合成多張圖 基於Struts2和Spring

今天工作要求把存在資料庫的圖片(blob)讀取出來,之前沒有做過所以找了不少資源,在這裡記錄一下。因為用的是jdbcTemplate,在這裡一起貼出來,以防忘了。因為資料庫查出來的圖片是多張圖,在這裡返回List,到前臺再轉成byte[]。有些方法是在查詢時直接轉成byte[]返回到頁面,但這樣只能返回一張圖片。

  [@Resource](https://my.oschina.net/u/929718)
    private JdbcTemplate jdbcTemplate;

    [@Override](https://my.oschina.net/u/1162528)
    public List<Blob> getPicture(String picid) throws Exception {
        final List<Blob> list = new ArrayList<Blob>();
        String sql = "select picture from pic where picid = ? ";
        Object[] params = new Object[]{picid};
        jdbcTemplate.query(sql, params,new RowMapper(){
            public Object mapRow(ResultSet rs,int index)throws SQLException{
                Blob img = rs.getBlob(1);
                list.add(img);
                return null;
            }
        });
        if(list!=null&&list.size()>0){
            return list;
        }else{
            return null;
        }
    }

因文在service層只是單純的呼叫,就不貼出來了。在action層呼叫方法後,返回List<Blob>,用blob.getBinaryStream()獲取InputStream,再將inputStream寫入緩衝流BufferedInputStream,最後用ImageIO讀取,並由ImageIO.read()傳輸到前臺頁面。 顯而易見,如果是一張圖片直接用上述方法傳輸就可以,但如果是多張圖片,就會被覆蓋。所以需要將圖片拼在一起。因為工作要求,不可以存圖片在伺服器上,所以這裡用流直接拼接圖片,參考了網上的方法,自己改了一點就ok了。

 public String getBlob() throws Exception{
    List<Blob> blobs = gbs.getPicture(fileid);
        List<BufferedImage> images = new ArrayList<BufferedImage>();
        if(blobs!=null){
            for(int i=0;i<blobs.size();i++){
                //資料庫拿到的blob轉bufferedimage
                InputStream in = blobs.get(i).getBinaryStream();
                BufferedImage image = null;
                BufferedInputStream ins = new BufferedInputStream(in);
                image = ImageIO.read(ins);
                if(image!=null){
                    images.add(image);
                }
            }
        }
        BufferedImage imagenew = yMerge("PNG",images);//Java縱向拼接多張圖片
        if(imagenew!=null){
            //寫入前臺
            HttpServletResponse response = ServletActionContext.getResponse();
            response.setContentType("image/png");
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            ImageIO.write(imagenew, "PNG", response.getOutputStream());
        }
        return null;
    }
    }
    /**
     * Java縱向拼接多張圖片
     *
     * [@param](https://my.oschina.net/u/2303379) imgs
     * [@param](https://my.oschina.net/u/2303379) type 圖片型別
     * [@param](https://my.oschina.net/u/2303379) dst_pic
     * @return
     */
    public static BufferedImage yMerge(String type, List<BufferedImage> images) {
        //獲取需要拼接的圖片長度
        int len = images.size();
        //判斷長度是否大於0
        if (len < 1) {
            return null;
        }
        int[][] ImageArrays = new int[len][];
        for (int i = 0; i < len; i++) {
            int width = images.get(i).getWidth();
            int height = images.get(i).getHeight();
            // 從圖片中讀取RGB 畫素
            ImageArrays[i] = new int[width * height];
            ImageArrays[i] = images.get(i).getRGB(0, 0, width, height, ImageArrays[i], 0, width);
        }

        int dst_height = 0;
        int dst_width = images.get(0).getWidth();
        //合成圖片畫素
        for (int i = 0; i < len; i++) {
            dst_width = dst_width > images.get(i).getWidth() ? dst_width : images.get(i).getWidth();
            dst_height += images.get(i).getHeight();
        }
        
        //合成後的圖片
        if (dst_height < 1) {
            return null;
        }
        // 生成新圖片
        BufferedImage ImageNew = null;
        try {
            ImageNew = new BufferedImage(dst_width, dst_height,BufferedImage.TYPE_INT_ARGB);
            //TYPE_INT_ARGB:生成圖片的背景色為透明
            int height_i = 0;
            for (int i = 0; i < images.size(); i++) {
                ImageNew.setRGB(0, height_i, images.get(i).getWidth(), images.get(i).getHeight(),
                        ImageArrays[i], 0, images.get(i).getWidth());// dst_width
                height_i += images.get(i).getHeight();
            }

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return ImageNew;
    }

struts2中配置

        <action name = "getPicture" class = "getPictureAction" method = "getPicture">
            <result name="success" type="stream">
                <!-- 檔案格式定義 -->
                <param name="contentType">application/octet-stream</param>
                <param name="inputName">inputStream</param>
                <param name="contentDisposition">attachment;filename=${fileName}</param>
                <param name="bufferSize">1024</param>
            </result>
        </action>

JSP頁面

    <img alt="圖片" src="<%=basePath%>/getPicture.action">

參考文章:https://blog.csdn.net/luckgl/article/details/77054218