今天接着进行软件构造实验二
package Vfx; import okhttp3.*; import org.json.JSONObject; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Base64; import java.net.URLEncoder; public class Picture { private static final String API_KEY = "azh8NUHqQ6xfYxsycMj5064k"; private static final String SECRET_KEY = "RCrBgDCGT0gA0H0XuHHf8POXX5ExAi4G"; private static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build(); private static byte[] originalImageData; private static JLabel processedLabel; // 将processedLabel定义为类级别的变量 public static void main(String[] args) { SwingUtilities.invokeLater(() -> createAndShowGUI()); } private static void createAndShowGUI() { JFrame frame = new JFrame("图像处理 GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 800); JPanel panel = new JPanel(new GridBagLayout()); JLabel originalLabel = new JLabel("原始图像"); processedLabel = new JLabel("处理后的图像"); JButton loadButton = new JButton("加载图像"); JButton executeButton = new JButton("确定"); // 设置按钮的首选大小 loadButton.setPreferredSize(new Dimension(150, 40)); executeButton.setPreferredSize(new Dimension(150, 40)); // 下拉框,用于选择处理方式 String[] options = {"增强图像", "动漫化"}; JComboBox<String> processingOptions = new JComboBox<>(options); GridBagConstraints gbc = new GridBagConstraints(); // 添加“加载图像”按钮 gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets(10, 10, 10, 10); panel.add(loadButton, gbc); // 添加“原始图像”标签 gbc.gridx = 1; gbc.gridy = 0; gbc.insets = new Insets(10, 10, 10, 10); panel.add(originalLabel, gbc); // 添加下拉框 gbc.gridx = 0; gbc.gridy = 1; gbc.insets = new Insets(10, 10, 10, 10); panel.add(processingOptions, gbc); // 添加“确定”按钮 gbc.gridx = 1; gbc.gridy = 1; gbc.insets = new Insets(10, 10, 10, 10); panel.add(executeButton, gbc); // 添加“处理后的图像”标签 gbc.gridx = 1; gbc.gridy = 2; gbc.insets = new Insets(10, 10, 10, 10); panel.add(processedLabel, gbc); loadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { originalImageData = readImageFile(chooseImageFile()); displayImage(originalLabel, originalImageData); } catch (IOException ex) { ex.printStackTrace(); } } }); executeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (originalImageData != null) { try { String selectedOption = (String) processingOptions.getSelectedItem(); if ("增强图像".equals(selectedOption)) { enhanceImage(); } else if ("动漫化".equals(selectedOption)) { cartoonizeImage(); } } catch (IOException ex) { ex.printStackTrace(); } } else { JOptionPane.showMessageDialog(null, "请先选择图像再进行处理!"); } } }); frame.setLayout(new BorderLayout()); frame.add(panel, BorderLayout.NORTH); // 设置图片标签的固定大小 originalLabel.setPreferredSize(new Dimension(400, 300)); processedLabel.setPreferredSize(new Dimension(400, 300)); frame.setVisible(true); } private static void enhanceImage() throws IOException { String originalImageBase64 = getFileContentAsBase64(originalImageData, true); MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); RequestBody body = RequestBody.create(mediaType, "image=" + originalImageBase64); Request request = new Request.Builder() .url("https://aip.baidubce.com/rest/2.0/image-process/v1/image_definition_enhance?access_token=" + getAccessToken()) .method("POST", body) .addHeader("Content-Type", "application/x-www-form-urlencoded") .addHeader("Accept", "application/json") .build(); Response response = HTTP_CLIENT.newCall(request).execute(); String processedImageBase64 = new JSONObject(response.body().string()).getString("image"); byte[] processedImageData = Base64.getDecoder().decode(processedImageBase64); displayImage(processedLabel, processedImageData); } private static void cartoonizeImage() throws IOException { String originalImageBase64 = getFileContentAsBase64(originalImageData, true); MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); RequestBody body = RequestBody.create(mediaType, "image=" + originalImageBase64); Request request = new Request.Builder() .url("https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime?access_token=" + getAccessToken()) .method("POST", body) .addHeader("Content-Type", "application/x-www-form-urlencoded") .addHeader("Accept", "application/json") .build(); Response response = HTTP_CLIENT.newCall(request).execute(); String processedImageBase64 = new JSONObject(response.body().string()).getString("image"); byte[] processedImageData = Base64.getDecoder().decode(processedImageBase64); displayImage(processedLabel, processedImageData); } private static String chooseImageFile() { JFileChooser fileChooser = new JFileChooser(); int result = fileChooser.showOpenDialog(null); if (result == JFileChooser.APPROVE_OPTION) { return fileChooser.getSelectedFile().getPath(); } return null; } private static String getFileContentAsBase64(byte[] imageData, boolean urlEncode) throws IOException { String base64 = Base64.getEncoder().encodeToString(imageData); if (urlEncode) { base64 = URLEncoder.encode(base64, "utf-8"); } return base64; } private static String getAccessToken() throws IOException { MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY); Request request = new Request.Builder() .url("https://aip.baidubce.com/oauth/2.0/token") .method("POST", body) .addHeader("Content-Type", "application/x-www-form-urlencoded") .build(); Response response = HTTP_CLIENT.newCall(request).execute(); return new JSONObject(response.body().string()).getString("access_token"); } private static byte[] readImageFile(String fileName) throws IOException { Path path = Paths.get(fileName); return Files.readAllBytes(path); } private static void displayImage(JLabel label, byte[] imageData) { ImageIcon icon = new ImageIcon(imageData); // 设置图片标签的图标并强制重绘 label.setIcon(icon); label.revalidate(); label.repaint(); } }