12.8每日总结
今天接着进行软件构造实验二
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();
}
}
浙公网安备 33010602011771号