首页 > 其他分享 >软件构造 实验二

软件构造 实验二

时间:2023-12-25 22:11:26浏览次数:27  
标签:java String image 构造 originalLabel 实验 import 软件 new

实验二:百度图像增强与特效SDK实验(2023.12.6日完成)

    任务一:下载配置百度图像增强与特效的Java相关库及环境(占10%)。

    任务二:了解百度图像增强与特效相关功能并进行总结(占20%)。

    任务三:完成图像增强GUI相关功能代码并测试调用,要求上传自己的模糊照片进行图像增强(占30%)。

    任务四:完成图像特效GUI相关功能代码并测试调用,要求上传自己的照片进行图像特效(占30%)。

    实验总结:(占10%)

    实验效果样例图:

    

    

    参考资料:https://cloud.baidu.com/product/imageprocess

    https://cloud.baidu.com/doc/IMAGEPROCESS/index.html

package org.example.test2;

import okhttp3.*;
import org.json.JSONObject;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
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 App {

    private static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGUI());
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("图像增强应用");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 300);

        JPanel mainPanel = new JPanel(new BorderLayout());

        JPanel imagePanel = new JPanel(new GridLayout(1, 2));

        JLabel originalLabel = new JLabel();
        JLabel enhancedLabel = new JLabel();

        imagePanel.add(originalLabel);
        imagePanel.add(enhancedLabel);

        JPanel buttonPanel = new JPanel();
        JButton enhanceButton = new JButton("图像动漫化");
        JButton chooseFileButton = new JButton("选择图片");

        chooseFileButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                chooseFile(originalLabel);
            }
        });

        enhanceButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    enhanceImages(originalLabel, enhancedLabel);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });

        buttonPanel.add(chooseFileButton);
        buttonPanel.add(enhanceButton);

        mainPanel.add(imagePanel, BorderLayout.CENTER);
        mainPanel.add(buttonPanel, BorderLayout.NORTH);

        frame.getContentPane().add(mainPanel);
        frame.setVisible(true);
    }

    private static void chooseFile(JLabel originalLabel) {
        JFileChooser fileChooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter("Image Files", "jpg", "jpeg", "png", "gif");
        fileChooser.setFileFilter(filter);

        int result = fileChooser.showOpenDialog(null);

        if (result == JFileChooser.APPROVE_OPTION) {
            String filePath = fileChooser.getSelectedFile().getAbsolutePath();
            ImageIcon originalImageIcon = new ImageIcon(filePath);

            // 自适应显示在标签中
            int width = originalLabel.getWidth();
            int height = originalLabel.getHeight();
            originalLabel.setIcon(new ImageIcon(originalImageIcon.getImage().getScaledInstance(width, height, Image.SCALE_SMOOTH)));
        }
    }

    private static void enhanceImages(JLabel originalLabel, JLabel enhancedLabel) throws IOException {
        // 获取用户选择的原始图像路径
        String filePath = getUserSelectedFilePath(originalLabel);

        if (filePath == null) {
            JOptionPane.showMessageDialog(null, "请选择图片");
            return;
        }

        // 读取图像文件并将其转换为 Base64
        boolean urlEncode = true;
        String imageBase64 = getFileContentAsBase64(filePath, urlEncode);

        // 创建包含 Base64 编码图像的请求体
        RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), "image=" + imageBase64);

        // 发送 API 请求
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime?access_token=24.025f806eb27acb5cf0cf11a5817a612c.2592000.1705069401.282335-44919292")
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .addHeader("Accept", "application/json")
                .build();

        Response response = HTTP_CLIENT.newCall(request).execute();

        // 处理 API 响应
        String responseBody = response.body().string();
        JSONObject jsonResponse = new JSONObject(responseBody);

        // 从 JSON 中提取增强后的图像信息
        String enhancedImageBase64 = jsonResponse.optString("image", "");

        // 构造输出文件的路径,与输入文件在同一目录下,文件名为enhanced_image.jpg
        String outputFileName = "enhanced_image.jpg";
        String outputPath = "C://Users//dell//Pictures//Saved Pictures//img"+outputFileName;

        // 将Base64编码转换为图像并导出
        exportBase64Image(enhancedImageBase64, outputPath);

        // 显示增强后的图像
        ImageIcon enhancedImageIcon = new ImageIcon(outputPath);

        // 自适应显示在标签中
        int width = originalLabel.getWidth();
        int height = originalLabel.getHeight();
        enhancedLabel.setIcon(new ImageIcon(enhancedImageIcon.getImage().getScaledInstance(width, height, Image.SCALE_SMOOTH)));

        // 显示弹窗消息
        // JOptionPane.showMessageDialog(null, "图像保存至:" + outputPath);
    }

    private static String getUserSelectedFilePath(JLabel originalLabel) {
        Icon icon = originalLabel.getIcon();
        if (icon != null && icon instanceof ImageIcon) {
            Image image = ((ImageIcon) icon).getImage();
            String description = "User Selected Image";
            MediaTracker tracker = new MediaTracker(originalLabel);
            tracker.addImage(image, 0);
            try {
                tracker.waitForAll();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 直接返回图像的路径,而无需保存到临时文件
            try {
                BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
                Graphics2D g2d = bufferedImage.createGraphics();
                g2d.drawImage(image, 0, 0, null);
                g2d.dispose();

                // 创建临时文件并获取路径
                Path tempPath = Files.createTempFile("temp_selected_image", ".jpg");
                ImageIO.write(bufferedImage, "jpg", tempPath.toFile());

                // 返回临时文件的路径
                return tempPath.toString();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    private static String getFileContentAsBase64(String path, boolean urlEncode) throws IOException {
        byte[] b = Files.readAllBytes(Paths.get(path));
        String base64 = Base64.getEncoder().encodeToString(b);
        if (urlEncode) {
            base64 = URLEncoder.encode(base64, "utf-8");
        }
        return base64;
    }

    private static void exportBase64Image(String base64String, String outputPath) throws IOException {
        // 将Base64字符串解码为字节数组
        byte[] decodedBytes = Base64.getDecoder().decode(base64String);

        // 将字节数组写入输出文件
        try (FileOutputStream outputStream = new FileOutputStream(outputPath)) {
            outputStream.write(decodedBytes);
        }
    }
}

标签:java,String,image,构造,originalLabel,实验,import,软件,new
From: https://www.cnblogs.com/lin513/p/17927087.html

相关文章

  • WPF Halcon机器视觉和运动控制软件通用框架,插件式开发,开箱即用 仅供学习!
    点我下载,仅供个人学习使用参考easyvision开发,集成几十个软件算子此版本以添加ui设计器。具体功能如上所示,可以自定义变量,写c#脚本,自定义流程,包含了halcon脚本和封装的算子,可自定义ui,通过插件形式开发很方便拓展自己的功能。......
  • 《架构师之路:软件架构之美》阅读三
    老师教我们软件架构的时候,就告诉我们,软件开发,先从架构入手。他说,弄清楚了架构,再来学习具体的语法和技术就很简单了。以前不懂,底层具体的细节都不了解,如何来构建一个系统呢?就像让我们去建造一栋大厦,刚开始想到的可能就是需要砖、砌墙的工具、、、、、这就像刚学习编程的自己,以为掌......
  • STM32 IIC温湿度传感器(STH45)实验
    SHT45简介.精度ΔRH=±1.0%RH,ΔT=±0.1°C•VDD=1.08V…3.6V•平均电流:0.4μA,空闲电流:80nA•I2CFM、CRC校验和、乘法。I2C地址。•专利保护选项[1]、PTFE膜和可拆卸保护盖•工作范围:0…100%相对湿度,−40…125摄氏度•在冷凝环境中功能齐全•......
  • 《敏捷软件需求》阅读笔记三
    这些天阅读的是《敏捷软件需求》的九到十六章,接下来写的是关于敏捷软件需求这本书籍的九到十六章节的阅读心得体会,涵盖了每章的主要观点和个人体会:第九章:需求估算和规划这一章讨论了敏捷项目中的需求估算和规划。我学到了估算在敏捷开发中的重要性,以及如何使用不同的估算技术来......
  • 《敏捷软件需求》阅读笔记二
    这些天阅读的是《敏捷软件需求》的九到十六章,接下来写的是关于敏捷软件需求这本书籍的九到十六章节的阅读心得体会,涵盖了每章的主要观点和个人体会:第九章:需求估算和规划这一章讨论了敏捷项目中的需求估算和规划。我学到了估算在敏捷开发中的重要性,以及如何使用不同的估算技术来......
  • 软件测试面试——如何提高测试用例覆盖率?
    如何提高测试用例覆盖率?在项目的初期,我们参与到需求评审中1.覆盖显性需求需求文档或原型图上已经标注清楚的功能一定要全部覆盖,通过思维导图工具进行梳理一般都能保证。2.获取隐含需求隐含需求的获取是一大难点,但需求就像冰山,露在水面的始终只是极少的一部分。3.合理使用合适的......
  • 《敏捷软件需求》阅读笔记一
    以下是关于敏捷软件需求这本书籍的前八章的阅读心得体会,涵盖了每章的主要观点和个人体会:第一章:敏捷方法概述    第一章介绍了敏捷方法的起源和核心原则,其中最关键的原则是个体与交互、工作的软件、客户合作和响应变化。我学到了敏捷方法的灵活性和迭代开发是应对不断变化......
  • 《软件需求开发最佳实践:基于模型驱动的需求开发过程》笔记三
    在阅读《软件需求开发最佳实践:基于模型驱动的需求开发过程》的七到最后一章后,我对基于模型驱动的需求开发过程有了更深入的理解和掌握。这些章节详细介绍了需求工程的实践案例、团队协作和沟通技巧,以及持续改进和评估等方面的内容,为我提供了更全面的指导和启示。在实践案例方面,书......
  • 《软件需求开发最佳实践:基于模型驱动的需求开发过程》笔记二
    在阅读《软件需求开发最佳实践:基于模型驱动的需求开发过程》的四到六后,我对基于模型驱动的需求开发过程有了更深入的理解和掌握。这些章节详细介绍了需求工程的实践案例、团队协作和沟通技巧,以及持续改进和评估等方面的内容,为我提供了更全面的指导和启示。在实践案例方面,书中通过......
  • 《软件需求开发最佳实践:基于模型驱动的需求开发过程》笔记一
    在阅读《软件需求开发最佳实践:基于模型驱动的需求开发过程》的一到三章后,我对基于模型驱动的需求开发过程有了更深入的理解和掌握。这些章节详细介绍了需求工程的实践案例、团队协作和沟通技巧,以及持续改进和评估等方面的内容,为我提供了更全面的指导和启示。在实践案例方面,书中通......