Java實現的圖片合併方法,支援水平和垂直合併
阿新 • • 發佈:2022-04-29
直接上程式碼,這是實際專案中應用的,如果需要可以直接複製使用即可。
import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.UUID; import javax.imageio.ImageIO; /** * 圖片合併方法 * @author Java自學通 * */ public class TestIMage { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<String> list =new ArrayList<String> (); list.add("D://1//1.jpg"); list.add("D://1//2.jpg"); String path="D://1"; doVImageMerging2(list,path); } //2張圖片水平合併 public static String doVImageMerging2(ArrayList<String> list, String pathFile) { // 讀取待合併的檔案 BufferedImage bi1 = null; BufferedImage bi2 = null; // 呼叫mergeImage方法獲得合併後的影象 BufferedImage destImg = null; try { bi2 = getBufferedImage(list.get(0)); bi1 = getBufferedImage(list.get(1)); } 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); return savePath + fileName; } public static BufferedImage getBufferedImage(String fileUrl) throws IOException { File f = new File(fileUrl); return ImageIO.read(f); } /** * 待合併的兩張圖必須滿足這樣的前提,如果水平方向合併,則高度必須相等;如果是垂直方向合併,寬度必須相等。 * 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); Graphics2D g2d = null; if (h1 >= h2) { DestImage = new BufferedImage(w1 + w2, h1, BufferedImage.TYPE_INT_RGB); g2d = DestImage.createGraphics(); g2d.setPaint(Color.WHITE); g2d.fillRect(0, 0, w1 + w2, h1); g2d.dispose(); } else { DestImage = new BufferedImage(w2, h1, BufferedImage.TYPE_INT_RGB);//TYPE_INT_RGB g2d = DestImage.createGraphics(); g2d.setPaint(Color.WHITE); g2d.fillRect(0, 0, w2 + w1, h1); g2d.dispose(); } 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 + w2, 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 + w1, 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; } 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; } }