JAVA 資料庫讀取blob(圖片)合成多張圖 基於Struts2和Spring
阿新 • • 發佈:2018-12-09
今天工作要求把存在資料庫的圖片(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