使用AI工具Copilot 5分钟解决实际问题有感

背景:今天投某公司的简历时需要添加成绩单,我的成绩单截图有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);
    }
}