Java中圖片處理工具類——能滿足各種需求
阿新 • • 發佈:2022-04-29
在多年Java開發過程中我總結了一些處理圖片的方法,把程式碼分享出來與大家一起學習,程式碼如下:
import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.UUID; import javax.imageio.ImageIO; /** * * @專案名 ssh * @功能 圖片處理工具 * @類名 ImageTools * @作者 wurui * @日期 Aug 30, 20113:26:42 PM * @版本 1.0 */ public class ImageTools { private static final int WIDTH = 220; /** * 根據圖片路徑讀取圖片到緩 * * @param fileName * 圖片路徑 * @return */ public static BufferedImage readImage(String fileName) { BufferedImage bi = null; try { bi = ImageIO.read(new File(fileName)); } catch (IOException ioe) { ioe.printStackTrace(); } return bi; } /** * 根據檔案物件讀取到緩 * * @param file * 檔案物件 * @return */ public static BufferedImage readImage(File file) { BufferedImage bi = null; try { bi = ImageIO.read(file); } catch (IOException ioe) { ioe.printStackTrace(); } return bi; } /** * 將快取圖片輸出到檔案�? * * @param im * 快取圖片 * @param formatName * 檔案格式(字尾:jpg) * @param fileName * 檔案路徑 * @return */ public static boolean writeImage(RenderedImage im, String formatName, String fileName) { boolean result = false; try { result = ImageIO.write(im, formatName, new File(fileName)); } catch (IOException ioe) { ioe.printStackTrace(); } return result; } /** * 將快取圖片輸出到檔案�? * * @param im * 快取圖片 * @param formatName * 檔案格式(字尾:jpg) * @param targetFile * 目標檔案�? * @return */ public static boolean writeImage(RenderedImage im, String formatName, File targetFile) { boolean result = false; try { result = ImageIO.write(im, formatName, targetFile); } catch (IOException ioe) { ioe.printStackTrace(); } return result; } /** * 將快取圖片輸出到輸出�? * @param im * @param formatName * @param stream * @return */ public static boolean writeImage(RenderedImage im, String formatName, OutputStream stream) { boolean result = false; try { result = ImageIO.write(im, formatName, stream); } catch (IOException ioe) { ioe.printStackTrace(); } return result; } /** * 輸出為JPEG格式圖片 * * @param im * @param fileName * @return */ public static boolean writeJPEGImage(RenderedImage im, String fileName) { return writeImage(im, "JPEG", fileName); } /** * 輸出為JPEG格式 * * @param im * @param targetFile * @return */ public static boolean writeJPEGImage(RenderedImage im, File targetFile) { return writeImage(im, "JPEG", targetFile); } public static boolean writeGIFImage(RenderedImage im, String fileName) { return writeImage(im, "GIF", fileName); } public static boolean writeGIFImage(RenderedImage im, File targetFile) { return writeImage(im, "GIF", targetFile); } public static boolean writePNGImage(RenderedImage im, String fileName) { return writeImage(im, "PNG", fileName); } public static boolean writePNGImage(RenderedImage im, File targetFile) { return writeImage(im, "PNG", targetFile); } public static boolean writeBMPImage(RenderedImage im, String fileName) { return writeImage(im, "BMP", fileName); } public static boolean writeBMPImage(RenderedImage im, File targetFile) { return writeImage(im, "BMP", targetFile); } /** * 複製圖片到目標文�? * * @param file * 源文�? * @param targetFile * 目標檔案 * @return 真為成功 */ public static boolean copyImage(File file, File targetFile) { String postfix = getPostfix(file); if ("JPEG".equalsIgnoreCase(postfix) || "GPG".equalsIgnoreCase(postfix)) { return writeJPEGImage(writeThumb(file), targetFile); } if ("GIF".equalsIgnoreCase(postfix)) { return writeGIFImage(writeThumb(file), targetFile); } if ("PNG".equalsIgnoreCase(postfix)) { return writePNGImage(writeThumb(file), targetFile); } if ("BMP".equalsIgnoreCase(postfix)) { return writeBMPImage(writeThumb(file), targetFile); } return writeJPEGImage(writeThumb(file), targetFile); } /** * 複製圖片檔案 * * @param file * 源文�? * @param targetFile * 目標檔案 * @param width * 寬度 * @return */ public static boolean copyImage(File file, File targetFile, int width) { String postfix = getPostfix(file); if ("JPEG".equalsIgnoreCase(postfix) || "GPG".equalsIgnoreCase(postfix)) { return writeJPEGImage(writeThumb(file, width), targetFile); } if ("GIF".equalsIgnoreCase(postfix)) { return writeGIFImage(writeThumb(file, width), targetFile); } if ("PNG".equalsIgnoreCase(postfix)) { return writePNGImage(writeThumb(file, width), targetFile); } if ("BMP".equalsIgnoreCase(postfix)) { return writeBMPImage(writeThumb(file, width), targetFile); } return writeJPEGImage(writeThumb(file, width), targetFile); } /** * 得到檔案字尾名稱 * * @param file * 檔案 * @return */ public static String getPostfix(File file) { String postfix = file.getAbsolutePath(); postfix = postfix.substring(postfix.lastIndexOf(".") + 1).toUpperCase(); return postfix; } /** * 寬度超過預設值後,得到縮放圖�? * * @param file * 檔案 * @return */ public static BufferedImage writeThumb(File file) { BufferedImage bi = null; try { bi = ImageIO.read(file); int x = 0, y = 0; if (bi.getWidth() > WIDTH) { x = WIDTH; y = Math.round(bi.getHeight() / (bi.getWidth() / (x * 1.0f))); } else { x = bi.getWidth(); y = bi.getHeight(); } return getZoomImage(bi, x, y); } catch (IOException e) { e.printStackTrace(); } return bi; } /** * 寬度超過預設值後,得到縮放圖�? * * @param file * 檔案 * @param width * 寬度 * @return 快取圖片 */ public static BufferedImage writeThumb(File file, int width) { int x = 0, y = 0; if (width > WIDTH) { x = WIDTH; y = Math.round(width / (width / (x * 1.0f))); } else { x = width; y = width; } return getZoomImage(file, x, y); } /** * 根據檔案路徑和寬度高度得到縮放圖�? * * @param path * 路徑 * @param width * 寬度 * @param height * 高度 * @return 快取圖片 */ public static BufferedImage getZoomImage(String path, int width, int height) { return getZoomImage(new File(path), width, height); } /** * 得到縮放圖片 * * @param file * 檔案 * @param width * @param height * @return */ public static BufferedImage getZoomImage(File file, int width, int height) { BufferedImage bi; BufferedImage oimage = null; try { bi = ImageIO.read(file); return getZoomImage(bi, width, height); } catch (IOException e) { e.printStackTrace(); } return oimage; } /** * 得到縮放圖片 * * @param img * 圖片 * @param width * 寬度 * @param height * 高度 * @return */ public static BufferedImage getZoomImage(Image img, int width, int height) { BufferedImage oimage = null; Image temp = img.getScaledInstance(width, height, Image.SCALE_DEFAULT); oimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); oimage.getGraphics().drawImage(temp, 0, 0, null); oimage.getGraphics().dispose(); return oimage; } //實現人員簽名圖片合併 public static String doImageMerging(String docIDs){ //C:softgzex5X5.2.7_devX5.2.7apache-tomcatwebapps.... untimeBusinessServer String path=""; String[] tempPaths=path.split("webapps"); // 在記憶體中建立一個檔案物件,注意:此時還沒有在硬碟對應目錄下建立實實在在的檔案 String pathFile=tempPaths[0]+"personImages"; //測試 String fileNameTemap="bbbb"; crateFiles(pathFile,fileNameTemap); //根據docId下載圖片 String[] images=docIDs.split(","); String image1=pathFile + "//"+createImageName()+".jpg";//圖片1地址 try { download(images[0], new File(image1)); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } String image2=pathFile + "//"+createImageName()+".jpg";;//圖片2地址 try { download(images[1], new File(image2)); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 讀取待合併的檔案 BufferedImage bi1 = null; BufferedImage bi2 = null; // 呼叫mergeImage方法獲得合併後的影象 BufferedImage destImg = null; // System.out.println("圖片合併的情況:"); try { bi2 = getBufferedImage(image1); bi1 = getBufferedImage(image2); } catch (IOException e) { e.printStackTrace(); } // 呼叫mergeImage方法獲得合併後的影象 try { destImg = mergeImage(bi1, bi2, false);//true為水平,false為垂直 } catch (IOException e) { e.printStackTrace(); } // 儲存影象 String savePath=pathFile+"//";//檔案存放路徑 String fileName=createImageName()+".jpg";//檔名稱 String fileType="jpg";//檔案格式 saveImage(destImg, savePath,fileName, fileType); System.out.println("圖片合併完畢!"); return savePath+fileName; } //建立資料夾 private static void crateFiles(String path,String fileName){ File f = new File(path,fileName); if(f.exists()) { // 檔案已經存在,輸出檔案的相關資訊 System.out.println(f.getAbsolutePath()); System.out.println(f.getName()); System.out.println(f.length()); } else { // 先建立檔案所在的目錄 f.getParentFile().mkdirs(); try { // 建立新檔案 f.createNewFile(); } catch (IOException e) { System.out.println("建立新檔案時出現了錯誤。。。"); e.printStackTrace(); } } } //下載圖片 public static void download(String urlString, File filename) throws Exception { System.out.println("download xml start......."); URL url = new URL(urlString); URLConnection con = url.openConnection(); InputStream is = con.getInputStream(); byte[] bs = new byte[1024]; int len; OutputStream os = new FileOutputStream(filename); while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } os.close(); is.close(); System.out.println("download xml over......."); } /** * @param fileUrl * 檔案絕對路徑或相對路徑 * @return 讀取到的快取影象 * @throws IOException * 路徑錯誤或者不存在該檔案時丟擲IO異常 */ public static BufferedImage getBufferedImage(String fileUrl) throws IOException { File f = new File(fileUrl); return ImageIO.read(f); } /** * @param savedImg * 待儲存的影象 * @param saveDir * 儲存的目錄 * @param fileName * 儲存的檔名,必須帶字尾,比如 "beauty.jpg" * @param format * 檔案格式:jpg、png或者bmp * @return */ public static boolean saveImage(BufferedImage savedImg, String saveDir, String fileName, String format) { boolean flag = false; // 先檢查儲存的圖片格式是否正確 String[] legalFormats = { "jpg", "JPG", "png", "PNG", "bmp", "BMP" }; int i = 0; for (i = 0; i < legalFormats.length; i++) { if (format.equals(legalFormats[i])) { break; } } if (i == legalFormats.length) { // 圖片格式不支援 System.out.println("不是儲存所支援的圖片格式!"); return false; } // 再檢查檔案字尾和儲存的格式是否一致 String postfix = fileName.substring(fileName.lastIndexOf('.') + 1); if (!postfix.equalsIgnoreCase(format)) { System.out.println("待儲存檔案字尾和儲存的格式不一致!"); return false; } String fileUrl = saveDir + fileName; File file = new File(fileUrl); try { flag = ImageIO.write(savedImg, format, file); } catch (IOException e) { e.printStackTrace(); } return flag; } /** * 待合併的兩張圖必須滿足這樣的前提,如果水平方向合併,則高度必須相等;如果是垂直方向合併,寬度必須相等。 * mergeImage方法不做判斷,自己判斷。 * * @param img1 * 待合併的第一張圖 * @param img2 * 帶合併的第二張圖 * @param isHorizontal * 為true時表示水平方向合併,為false時表示垂直方向合併 * @return 返回合併後的BufferedImage物件 * @throws IOException */ public static BufferedImage mergeImage(BufferedImage img1, BufferedImage img2, boolean isHorizontal) throws IOException { int w1 = img1.getWidth(); int h1 = img1.getHeight(); int w2 = img2.getWidth(); int h2 = img2.getHeight(); // 從圖片中讀取RGB int[] ImageArrayOne = new int[w1 * h1]; ImageArrayOne = img1.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行掃描影象中各個畫素的RGB到陣列中 int[] ImageArrayTwo = new int[w2 * h2]; ImageArrayTwo = img2.getRGB(0, 0, w2, h2, ImageArrayTwo, 0, w2); // 生成新圖片 BufferedImage DestImage = null; if (isHorizontal) { // 水平方向合併 DestImage = new BufferedImage(w1+w2, h1, BufferedImage.TYPE_INT_RGB); DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 設定上半部分或左半部分的RGB DestImage.setRGB(w1, 0, w2, h2, ImageArrayTwo, 0, w2); } else { // 垂直方向合併 Graphics2D g2d=null; if(w1>w2){ DestImage = new BufferedImage(w1, h1 + h2, BufferedImage.TYPE_INT_RGB);//TYPE_INT_RGB g2d = DestImage.createGraphics(); g2d.setPaint(Color.WHITE); g2d.fillRect(0, 0, w1, h1 + h2); g2d.dispose(); } else{ DestImage = new BufferedImage(w2, h1 + h2, BufferedImage.TYPE_INT_RGB);//TYPE_INT_RGB g2d = DestImage.createGraphics(); g2d.setPaint(Color.WHITE); g2d.fillRect(0, 0, w2, h1 + h2); g2d.dispose(); } DestImage.setRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 設定上半部分或左半部分的RGB DestImage.setRGB(0, h1, w2, h2, ImageArrayTwo, 0, w2); // 設定下半部分的RGB } return DestImage; } //隨機生成圖片名稱 public static String createImageName(){ // 建立 GUID 物件 UUID uuid = UUID.randomUUID(); // 得到物件產生的ID String a = uuid.toString(); // 轉換為大寫 a = a.toUpperCase(); // 替換 - a = a.replaceAll("-", ""); return a; } }