1. 程式人生 > 其它 >Java實現的圖片合併方法,支援水平和垂直合併

Java實現的圖片合併方法,支援水平和垂直合併

直接上程式碼,這是實際專案中應用的,如果需要可以直接複製使用即可。

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;
}
}