2024/11/16
今天完成软件构造的实验二
百度图像增强与特效SDK实验(2024.11.22日完成)
任务一:下载配置百度图像增强与特效的Java相关库及环境(占10%)。
任务二:了解百度图像增强与特效相关功能并进行总结(占20%)。
任务三:完成图像增强GUI相关功能代码并测试调用,要求上传自己的模糊照片进行图像增强(占30%)。
任务四:完成图像特效GUI相关功能代码并测试调用,要求上传自己的照片进行图像特效(占30%)。
这里主要放置的时GUI页面具体的方法可以复制官网的实例代码然后修改即可
package com.mes.util; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import java.util.Base64; public class ImageProcessingGUI extends JFrame { private JButton selectImageButton; private JButton animeButton; private JButton enhanceButton; private JLabel originalImageLabel; // 用于显示原图片 private JLabel processedImageLabel; // 用于显示处理后的图片 private JLabel originalImagePlaceholder; // 原图片区域占位提示文本 private JLabel processedImagePlaceholder; // 处理后图片区域占位提示文本 private JFileChooser fileChooser; private File selectedImageFile; // 用于存储已选择的图片文件 public ImageProcessingGUI() { // 设置窗口标题 setTitle("图片处理工具"); // 设置窗口大小 setSize(800, 600); // 设置窗口关闭时的操作 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 使用BorderLayout布局管理器 setLayout(new BorderLayout()); // 创建并初始化按钮 selectImageButton = new JButton("选择图片"); animeButton = new JButton("人像动漫化"); enhanceButton = new JButton("增加图像清晰度"); // 设置按钮大小和颜色 Color buttonColor = new Color(59, 130, 246); selectImageButton.setBackground(buttonColor); animeButton.setBackground(buttonColor); enhanceButton.setBackground(buttonColor); selectImageButton.setForeground(Color.WHITE); animeButton.setForeground(Color.WHITE); enhanceButton.setForeground(Color.WHITE); // 设置按钮鼠标悬停效果 setButtonHoverEffect(selectImageButton); setButtonHoverEffect(animeButton); setButtonHoverEffect(enhanceButton); // 创建用于显示原图片和处理后图片的标签 originalImageLabel = new JLabel(); processedImageLabel = new JLabel(); // 创建原图片和处理后图片区域的占位提示文本 originalImagePlaceholder = new JLabel("原图", SwingConstants.CENTER); processedImagePlaceholder = new JLabel("结果图", SwingConstants.CENTER); // 设置图片显示标签的大小和样式 originalImageLabel.setPreferredSize(new Dimension(350, 350)); processedImageLabel.setPreferredSize(new Dimension(350, 350)); originalImageLabel.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); processedImageLabel.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY)); Color placeholderColor = new Color(150, 150, 150); originalImagePlaceholder.setForeground(placeholderColor); processedImagePlaceholder.setForeground(placeholderColor); // 创建文件选择器 fileChooser = new JFileChooser(); // 为选择图片按钮添加监听器 selectImageButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int returnVal = fileChooser.showOpenDialog(ImageProcessingGUI.this); if (returnVal == JFileChooser.APPROVE_OPTION) { selectedImageFile = fileChooser.getSelectedFile(); try { // 读取选中的图片文件 BufferedImage image = ImageIO.read(selectedImageFile); // 将原图片显示在对应的标签上 originalImageLabel.setIcon(new ImageIcon(image)); // 隐藏原图片区域的占位提示文本 originalImagePlaceholder.setVisible(false); } catch (IOException ex) { JOptionPane.showMessageDialog(ImageProcessingGUI.this, "读取图片失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } } }); // 为动漫化按钮添加监听器 animeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (selectedImageFile!= null) { // 获取已选择图片的路径 String imagePath = selectedImageFile.getAbsolutePath(); try { // 模拟调用将图片转换为Base64编码的方法 String base64Image = ToBase64.getFileContentAsBase64(imagePath, true); // 对Base64编码的图片进行人像动漫化处理 String resultImage = ChangeUtil.getAnimeImage(base64Image); // 将Base64编码转换为字节数组 byte[] imageBytes = Base64.getDecoder().decode(resultImage); // 将字节数组转换为BufferedImage BufferedImage processedImage = ImageIO.read(new java.io.ByteArrayInputStream(imageBytes)); // 将处理后的图片显示在对应的标签上 processedImageLabel.setIcon(new ImageIcon(processedImage)); // 隐藏处理后图片区域的占位提示文本 processedImagePlaceholder.setVisible(false); } catch (IOException ex) { JOptionPane.showMessageDialog(ImageProcessingGUI.this, "显示动漫化图片失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } else { JOptionPane.showMessageDialog(ImageProcessingGUI.this, "请先选择图片", "提示", JOptionPane.INFORMATION_MESSAGE); } } }); // 为增加清晰度按钮添加监听器 enhanceButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (selectedImageFile!= null) { // 获取已选择图片的路径 String imagePath = selectedImageFile.getAbsolutePath(); try { // 模拟调用将图片转换为Base64编码的方法,这里需要替换为你实际的方法 String base64Image = ToBase64.getFileContentAsBase64(imagePath, true); // 对Base64编码的图片进行增加清晰度处理 String resultImage = ChangeUtil.getClarityImage(base64Image); // 将Base64编码转换为字节数组 byte[] imageBytes = Base64.getDecoder().decode(resultImage); // 将字节数组转换为BufferedImage BufferedImage processedImage = ImageIO.read(new java.io.ByteArrayInputStream(imageBytes)); // 将处理后的图片显示在对应的标签上 processedImageLabel.setIcon(new ImageIcon(processedImage)); // 隐藏处理后图片区域的占位提示文本 processedImagePlaceholder.setVisible(false); } catch (IOException ex) { JOptionPane.showMessageDialog(ImageProcessingGUI.this, "显示增加清晰度图片失败: " + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } else { JOptionPane.showMessageDialog(ImageProcessingGUI.this, "请先选择图片", "请先选择图片", JOptionPane.INFORMATION_MESSAGE); } } }); // 创建一个面板用于放置按钮 JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout()); buttonPanel.add(selectImageButton); buttonPanel.add(animeButton); buttonPanel.add(enhanceButton); // 将按钮面板添加到窗口的北部区域 add(buttonPanel, BorderLayout.NORTH); // 创建一个面板用于放置图片显示标签和占位提示文本 JPanel originalImagePanel = new JPanel(new BorderLayout()); originalImagePanel.add(originalImageLabel, BorderLayout.CENTER); originalImagePanel.add(originalImagePlaceholder, BorderLayout.SOUTH); JPanel processedImagePanel = new JPanel(new BorderLayout()); processedImagePanel.add(processedImageLabel, BorderLayout.CENTER); processedImagePanel.add(processedImagePlaceholder, BorderLayout.SOUTH); // 创建一个主图片面板用于放置原图片和处理后图片面板 JPanel imagePanel = new JPanel(new FlowLayout()); imagePanel.add(originalImagePanel); imagePanel.add(processedImagePanel); // 将图片面板添加到窗口的中心区域 add(imagePanel, BorderLayout.CENTER); // 设置窗口可见 setVisible(true); } private void setButtonHoverEffect(JButton button) { button.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { button.setBackground(new Color(30, 85, 180)); } @Override public void mouseExited(MouseEvent e) { button.setBackground(new Color(59, 130, 246)); } }); } }