生成規定大小的圖片(縮圖生成)
阿新 • • 發佈:2019-02-09
要用到一個圖片生成的程式碼,網上找了下,有一個C#版本的,不是自己想要的,不過他描述的邏輯是和想的。最後自己考慮用兩張圖片合併後得到一個規定大小的圖片。
無論你現在上傳什麼樣的圖片,首先我們將底圖固定(比如為110*110),然後你的圖片可能是1000*800,或是200*300,都將第二張圖片向110*110圖片中寫入,根據比例計算好位置,這樣就保證了上傳的圖片最後不會被截圖並且生成了一張適合前端顯示的圖片。
看程式碼吧,有用的人就拿去,效率上還有待改進:
<pre class="java" name="code"> /** * 生成一張指定大小和路徑和透明背景圖片 * @param transparentWidth * @param transparentHeight * @param toPath * @throws IOException */ private synchronized static void drawTransparent(int transparentWidth, int transparentHeight, String toPath) throws IOException { int width = transparentWidth; int height = transparentHeight; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); g2d.dispose(); g2d = image.createGraphics(); g2d.setStroke(new BasicStroke(1)); // 釋放物件 g2d.dispose(); // 儲存檔案 ImageIO.write(image, "png", new File(toPath)); } /** * 生成縮圖-指定長或者寬的最大值來壓縮圖片 * @param transparentPath:指定的畫布大小,是一個指定大小的透明背景圖片 * @param srcImgPath:源圖片路徑 * @param outImgPath :輸出的壓縮圖片的路徑 * @param maxLength :長或者寬的最大值 * @throws IOException */ public synchronized static void createThumbnailImg(int transparentWidth,int transparentheight,String transparentPath,String srcImgPath, String outImgPath, int maxLength) throws IOException { String transPath=transparentPath +File.separator+transparentWidth+"_"+transparentheight+".png"; //如果透明背景圖存在則不處理 if(!(new File(transPath).exists())) { drawTransparent(transparentWidth,transparentheight,transPath); } BufferedImage src = null; InputStream is = null; InputStream is2 = null; //OutputStream os = null; BufferedImage transparentImage = null; try { //讀入底圖 is = new FileInputStream(transPath); //讀入源圖片 is2 = new FileInputStream(srcImgPath); //快取 transparentImage=javax.imageio.ImageIO.read(is); src = javax.imageio.ImageIO.read(is2); //源圖片不空才處理 if (null != src) { // 得到源圖寬 int old_w = src.getWidth(); // 得到源圖長 int old_h = src.getHeight(); // 新圖的寬 int new_w = 0; // 新圖的長 int new_h = 0; // 根據圖片尺寸壓縮比得到新圖的尺寸 //如果是寬比高大,則以寬為目標物件進行縮放 //即寬值固定,高度縮放的比例=maxLength/源圖寬 //maxLength大,則為放大,maxLength小則為縮小 if (old_w > old_h) { // 圖片要縮放的比例 new_w = maxLength; new_h = (int) Math.round(old_h * ((float) maxLength / old_w)); } else { new_w = (int) Math.round(old_w * ((float) maxLength / old_h)); new_h = maxLength; } // 生成新圖 BufferedImage newImg = null; // 判斷輸入圖片的型別 System.out.print("src.getType():" + src.getType()); switch (src.getType()) { case 13: // png,gif newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_4BYTE_ABGR); break; default: newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB); break; } Graphics2D g2d = newImg.createGraphics(); g2d.getDeviceConfiguration().createCompatibleImage(new_w, new_h, Transparency.TRANSLUCENT); // 從原圖上取顏色繪製新圖 g2d.drawImage(src, 0, 0, old_w, old_h, null); g2d.dispose(); // 根據圖片尺寸壓縮比得到新圖的尺寸 newImg.getGraphics() .drawImage( src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0, null); //========================到此處新圖處理完成============================= //========================現在開始做底圖與新圖的合併===================== // 底圖 BufferedImage image = transparentImage; // 要新增的圖片 BufferedImage image2 = newImg; // 得到底圖當畫布 Graphics g = image.getGraphics(); // 開始繪製 // 繪入的是要新增的圖,具體新增的位置是 // 底圖寬取2分之1減去要增的圖寬取2分之1處為X座標 // 底圖長取2分之1減去要增的圖長取2分之1處為Y座標 // --------------- // | __________ | // | | | | // | | | | // | |_________| | // | | // --------------- // 在元件區域的左上角(image.getWidth()/2-image2.getWidth()/2,image.getHeight()/2-image2.getHeight()/2)以原始大小顯示一個影象 g.drawImage(image2, image.getWidth() / 2 - image2.getWidth()/ 2, image.getHeight() / 2 - image2.getHeight() / 2, null); // 輸出 File file = new File(outImgPath); if (!file.exists()) { file.mkdirs(); } //if (!file.getParentFile().exists()) { // file.getParentFile().mkdir(); //} // 輸出到檔案流 System.out .println("outImgPath" + outImgPath.substring(outImgPath .lastIndexOf(".") + 1)); ImageIO.write(image, "png", new File(outImgPath)); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (is != null) { is.close(); } if (is2 != null) { is2.close(); } } }