java合併圖片合成多張橫向或豎向
阿新 • • 發佈:2018-11-07
java圖片合併 多張橫向或豎向合成圖片
前言:工作遇到需要把圖片合成一張圖片,在進行截圖。也遇到了很多問題,遇到的坑也分享出來。
圖片擷取:https://blog.csdn.net/qq_34846877/article/details/81324779
需求:先合成多張圖片,然後在合成的圖片中擷取圖片。本文中只寫合成圖片的方法。推薦第二種方案。
- 方案一
1、使用BufferedImage 兩張圖片的寬度要一致
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException ;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class PicImageTest3 {
/**
* 豎向合成
* 注意:該方法合成圖片需要圖片的寬度一樣,高度不一致也可以(查閱網上知道的,實際上有時候就是不行,藍瘦香菇。)
* @param files 傳入的圖片
* @param newFileName 合成圖片的名稱
*/*/
public static void jointPic(List<File> files, String newFileName) {
try {
BufferedImage[] imgs = new BufferedImage[files.size()];
//合成圖片的總高度
int h = 0;
for (int i = 0; i < files.size(); i++) {
imgs[i] = ImageIO.read(files.get(i));
h += imgs[i].getHeight();
}
int width = imgs[0].getWidth();
int height = imgs[0].getHeight();
int[] imgArray = new int[width * height];
// 合成圖片的引數 width要合成圖片寬度(已第一張圖片寬度為準),h合成圖片的總高度
BufferedImage imgNew = new BufferedImage(width, h, BufferedImage.TYPE_INT_RGB);
int _height = 0;
for (int i = 0; i < imgs.length; i++) {
imgs[i].getRGB(0, 0, width, height, imgArray, 0, width);
imgNew.setRGB(0, _height, width, height, imgArray, 0, width);
_height += imgs[i].getHeight();
}
File outFile = new File("C:/Users/Administrator/Desktop/001/" + newFileName);
ImageIO.write(imgNew, "jpg", outFile);// 寫圖片
System.out.println("===合併成功===");
} catch (Exception e) {
System.out.println("===合併失敗===");
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
List<File> files = new ArrayList<>();
String newFileName = "new001e.jpg";
File file1 = new File("C:/Users/Administrator/Desktop/001/NO1.jpg"); //2295 成功
File file2 = new File("C:/Users/Administrator/Desktop/001/NO2.jpg"); //2298
files.add(file1);
files.add(file2);
jointPic(files, newFileName);
}
}
- 方案二
1、使用BufferedImage 和 Graphics 寬高可以不一致,但是合成的圖片就有點奇怪了哦,不過基本相差不大的話,沒有影響。我是採用的第二種方案,親測有用,希望能夠帶給你便利。
// 下面是橫向合成的程式碼,替換下面的 豎向 程式碼即可
// 橫向
if (i==0) {
allHeight = imgs.get(0).getHeight();
}
allWidth += imgs.get(i).getWidth();
// 橫向合成
Integer width = 0;
for(int i=0; i< imgs.size(); i++){
g.drawImage(imgs.get(i), width, 0, null);
width += imgs.get(i).getWidth();
}
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
public class PicImageTest {
public static void jointPic(List<File> files, String path) {
try {
Integer allWidth = 0; // 圖片總寬度
Integer allHeight = 0; // 圖片總高度
List<BufferedImage> imgs = new ArrayList<>();
for(int i=0; i<files.size(); i++){
imgs.add(ImageIO.read(files.get(i)));
//豎向
if (i==0) {
allWidth = imgs.get(0).getWidth();
}
allHeight += imgs.get(i).getHeight();
}
BufferedImage combined = new BufferedImage(allWidth, allHeight, BufferedImage.TYPE_INT_RGB);
// paint both images, preserving the alpha channels
Graphics g = combined.getGraphics();
// 豎向合成
Integer height = 0;
for(int i=0; i< imgs.size(); i++){
g.drawImage(imgs.get(i), 0, height, null);
height += imgs.get(i).getHeight();
}
ImageIO.write(combined, "jpg", new File(path));
System.out.println("===合成成功====");
} catch (Exception e) {
System.out.println("===合成失敗====");
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception{
List<File> files = new ArrayList<>();
File file1 = new File("C:/Users/Administrator/Desktop/001/NO1.jpg");
File file2 = new File("C:/Users/Administrator/Desktop/001/NO2.jpg");
files.add(file1);
files.add(file2);
String path = "C:/Users/Administrator/Desktop/001/NO-new-4.jpg";
jointPic(files, path);
}
}
以上就是我在這次工作中用的兩種合成圖片方案,第二種相容性強點,不會出現java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! 的錯誤。
推薦第二種。
如下是參考的部落格一:https://blog.csdn.net/henren555/article/details/36924939
部落格二:
第二個部落格忘記了,後面找到會更新上去。
如果有可以優化的地方隨時留言告知,感謝!