背景:今天投某公司的简历时需要添加成绩单,我的成绩单截图有6张但它那个系统只让提供一张,我就打算把我的那几个截图拼接到一起,但是画图工具不熟练,网上的在线工具太烂,这时我想到昨天刚接触的Copilot,我感觉这个业务逻辑并不复杂。
我的输入1:我现在有几个成绩截图,我想把他们拼接到一个图片文件上,要求要不损失画质,然后上传可以一次性上传多个文件,拼接好的图片可以手动选择保存的位置。
它就给我了一个代码:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ImageMerger {
public static BufferedImage mergeImages(List<String> imagePaths) throws IOException {
BufferedImage[] images = new BufferedImage[imagePaths.size()];
int totalWidth = 0;
int maxHeight = 0;
for (int i = 0; i < imagePaths.size(); i++) {
images[i] = ImageIO.read(new File(imagePaths.get(i)));
totalWidth += images[i].getWidth();
maxHeight = Math.max(maxHeight, images[i].getHeight());
}
BufferedImage mergedImage = new BufferedImage(totalWidth, maxHeight, BufferedImage.TYPE_INT_RGB);
int xOffset = 0;
for (BufferedImage img : images) {
mergedImage.createGraphics().drawImage(img, xOffset, 0, null);
xOffset += img.getWidth();
}
return mergedImage;
}
public static void saveImage(BufferedImage image) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Save Merged Image");
fileChooser.setFileFilter(new FileNameExtensionFilter("PNG Image", "png"));
int userSelection = fileChooser.showSaveDialog(null);
if (userSelection == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
try {
ImageIO.write(image, "png", new File(fileToSave.getAbsolutePath() + ".png"));
System.out.println("Image saved to " + fileToSave.getAbsolutePath() + ".png");
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("Save cancelled");
}
}
public static void main(String[] args) {
// 示例图片路径列表
List<String> imagePaths = List.of("path/to/image1.png", "path/to/image2.png", "path/to/image3.png");
try {
BufferedImage mergedImage = mergeImages(imagePaths);
saveImage(mergedImage);
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行发现没有GUI还得修改文件位置于是要求其改进。
我的输入2:我想要个配套的界面
接着就给我生成了:
import java.awt.BorderLayout;
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;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ImageMergerGUI extends JFrame {
private List<String> imagePaths = new ArrayList<>();
public ImageMergerGUI() {
setTitle("Image Merger");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JPanel panel = new JPanel();
JButton addButton = new JButton("Add Images");
JButton mergeButton = new JButton("Merge and Save");
addButton.addActionListener(e -> addImages());
mergeButton.addActionListener(e -> mergeAndSaveImages());
panel.add(addButton);
panel.add(mergeButton);
add(panel, BorderLayout.CENTER);
}
private void addImages() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(true);
fileChooser.setFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "jpeg"));
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File[] files = fileChooser.getSelectedFiles();
for (File file : files) {
imagePaths.add(file.getAbsolutePath());
}
}
}
private void mergeAndSaveImages() {
if (imagePaths.isEmpty()) {
System.out.println("No images selected");
return;
}
try {
BufferedImage mergedImage = ImageMerger.mergeImages(imagePaths);
ImageMerger.saveImage(mergedImage);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ImageMergerGUI gui = new ImageMergerGUI();
gui.setVisible(true);
}
}
然后我就直接启动:
添加后输出发现有问题就是第一张拼接的图片过小其它的可以于是
我的输入3:可以但是第一个图片大小好小和其它五个不一样
然后就可以正常使用了。其实在完成期间也有出现一些报错,我把报错直接复制给它,它就发现没有导入包。
体验下来感觉就一个字:通畅
下面附上最终代码,有需要该功能的可以直接使用了:
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ImageMerger {
public static BufferedImage mergeImages(List<String> imagePaths) throws IOException {
BufferedImage[] images = new BufferedImage[imagePaths.size()];
int totalWidth = 0;
int maxHeight = 0;
// 读取所有图片并计算总宽度和最大高度
for (int i = 0; i < imagePaths.size(); i++) {
images[i] = ImageIO.read(new File(imagePaths.get(i)));
maxHeight = Math.max(maxHeight, images[i].getHeight());
}
// 调整所有图片的大小,使它们具有相同的高度
for (int i = 0; i < images.length; i++) {
images[i] = resizeImage(images[i], maxHeight);
totalWidth += images[i].getWidth();
}
BufferedImage mergedImage = new BufferedImage(totalWidth, maxHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = mergedImage.createGraphics();
int xOffset = 0;
for (BufferedImage img : images) {
g2d.drawImage(img, xOffset, 0, null);
xOffset += img.getWidth();
}
g2d.dispose();
return mergedImage;
}
private static BufferedImage resizeImage(BufferedImage originalImage, int targetHeight) {
int targetWidth = (int) ((double) targetHeight / originalImage.getHeight() * originalImage.getWidth());
BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = resizedImage.createGraphics();
g2d.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
g2d.dispose();
return resizedImage;
}
public static void saveImage(BufferedImage image) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Save Merged Image");
fileChooser.setFileFilter(new FileNameExtensionFilter("PNG Image", "png"));
int userSelection = fileChooser.showSaveDialog(null);
if (userSelection == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
try {
ImageIO.write(image, "png", new File(fileToSave.getAbsolutePath() + ".png"));
System.out.println("Image saved to " + fileToSave.getAbsolutePath() + ".png");
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("Save cancelled");
}
}
}
GUI类:
import java.awt.BorderLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ImageMergerGUI extends JFrame {
private List<String> imagePaths = new ArrayList<>();
public ImageMergerGUI() {
setTitle("Image Merger");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JPanel panel = new JPanel();
JButton addButton = new JButton("Add Images");
JButton mergeButton = new JButton("Merge and Save");
addButton.addActionListener(e -> addImages());
mergeButton.addActionListener(e -> mergeAndSaveImages());
panel.add(addButton);
panel.add(mergeButton);
add(panel, BorderLayout.CENTER);
}
private void addImages() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(true);
fileChooser.setFileFilter(new FileNameExtensionFilter("Image Files", "jpg", "png", "jpeg"));
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File[] files = fileChooser.getSelectedFiles();
for (File file : files) {
imagePaths.add(file.getAbsolutePath());
}
}
}
private void mergeAndSaveImages() {
if (imagePaths.isEmpty()) {
System.out.println("No images selected");
return;
}
try {
BufferedImage mergedImage = ImageMerger.mergeImages(imagePaths);
ImageMerger.saveImage(mergedImage);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ImageMergerGUI gui = new ImageMergerGUI();
gui.setVisible(true);
}
}