美颜相机1.0
项目开发步骤
1 界面开发 美颜相机界面构成: 标题 尺寸 关闭方式 位置 可视化
2 创建主函数调用界面方法
3 添加两个面板 一个是按钮面板一个是图片面板 用JPanel
4 添加按钮到按钮面吧【注意:此时要用初始化按钮面板的方法initBtnPanel 并且将按钮添加到按钮面板上面 要将按钮面板传到方法中】
- 用一维字符串数组表示按钮 然后通过for循环遍历 将按钮文本添加到按钮上面 可以获得按钮的背景颜色 最后按钮一定要添加到按钮面板上
5 添加监听器 动作监听器和按钮监听器 在按钮动作监听器用 e.get~的方法获取文本信息 给按钮也添加监听器 在添加前先创建对象
6 按钮功能的实现 用if 和equals
- 打开功能的实现
先获取图片的绝对路径 用loadImage方法 先读取文件后ImageIO.read(path)读取文件的像素点 定义一个二维数组来储存图片 后用for遍历图片的像素点 用image.getRGB(i,j) 将BufferedImage对象Image中指定位置(i,j)的像素颜色取出来储存到二维数组中 for循环结束后 可输出图片加载完成
用文件选择器打开文件 FileChosser 打开文件位置null 用if判断选择时点了确定按钮 后获取所选择的文件的绝对路径 然后对图像处理对象 调用加载图像的方法将 转为像素的二维数组
- 原图功能的实现
画图片drawImage 现将像素取出来 然后获取每个像素点的颜色 将颜色给画笔【画笔是从绘制面板传过来】 后绘制像素点
在ImageProUI类中获取显示图片画板的画笔 然后imageLister对象中ImageUtils对象的画笔是面板的画笔【将面板的画笔赋给它】
后在按钮功能实现的地方调用方法
package lfx250220;import javax.swing.*;
import java.awt.*;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;public class ImageProUI {//界面开发 先写一个个方法然后把界面创建出来//创建面板 JPanle//创建一个监听器ImageLister imageLister=new ImageLister();public void showUI(){JFrame jf= new JFrame();//界面:大小 位置 关闭方式 可视化 布局方式jf.setTitle("美颜相机");jf.setSize(900,900);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//JPanel类 面板 相当于一个容器JPanel btnPanel = new JPanel();JPanel imgPanel = new JPanel();//设置面板属性btnPanel.setBackground(Color.CYAN);imgPanel.setBackground(Color.BLUE);//设置宽高用到Dimension类 维度Dimension dimension = new Dimension(300,100);btnPanel.setPreferredSize(dimension);//初始化按钮面板 调用initBtnPanel这个方法initBtnPanel(btnPanel);//布局: 流式布局(JPanel 默认布局) 边框布局(窗体的默认布局)//将面板添加到窗体上 用BorderLayout布局//BorderLayout布局: 是JFrame 的默认布局管理器 将容器划分为五个区域//北(BorderLayout.NORTH) 南(BorderLayout.SOUTH) 东(BorderLayout.EAST) 西(BorderLayout.WEST) 中(BorderLayout.CENTER)jf.add(btnPanel,BorderLayout.NORTH);jf.add(imgPanel,BorderLayout.CENTER);//FlowLayout flowLayout = new FlowLayout();//BorderLayout borderLayout = new BorderLayout();//jf.setLayout(flowLayout);//jf.setLayout(borderLayout);jf.setVisible(true);//获取 显示图片的画板 的画笔Graphics gra=imgPanel.getGraphics();imageLister.imageUtils.gra=gra;//gra是imageLister对象中imageUtils对象中的画笔}//初始化按钮面板//按钮是要添加到按钮面板上 所以要把按钮面板传过来public void initBtnPanel(JPanel btnPanel){String[] btnTexts = {"打开","保存","原图","马赛克","灰度"};//遍历 将每个按钮写出来 然后设置颜色for (int i=0;i< btnTexts.length;i++){JButton btn=new JButton(btnTexts[i]);btn.setBackground(Color.ORANGE);btnPanel.add(btn);btn.addActionListener(imageLister);}String[] btnTexts2={"画笔","直线","矩形","填充","截图","马赛克画笔"};for (int i=0;i< btnTexts2.length;i++){JButton btn=new JButton(btnTexts2[i]);btn.setBackground(Color.GREEN);btnPanel.add(btn);btn.addActionListener(imageLister);}}public static void main(String[] args) {ImageProUI showui=new ImageProUI();showui.showUI();}
}
package lfx250220;import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;public class ImageLister implements MouseListener, ActionListener {//【注意:函数的调用需要用对象来实现】//图像处理器ImageUtils imageUtils=new ImageUtils();@Overridepublic void actionPerformed(ActionEvent e) {//按钮的动作监听器 获取按钮的文本String ac=e.getActionCommand();System.out.println("ac"+ac);//按钮功能的实现if (ac.equals("打开")){//打开图片 目的 获取一张照片的绝对路径//用文件选择器将图片打开//文件过滤器FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & PNG","jpg", "png");//文件选择器JFileChooser jfc = new JFileChooser();int state = jfc.showOpenDialog(null);//参数对他的作用是一个位置作用 写成空就是居中if (state==JFileChooser.APPROVE_OPTION){//选择时点了确定按钮//获取所 选择的文件的 绝对路径String path = jfc.getSelectedFile().getAbsolutePath();//图像处理对象 调用加载图片的方法 转为像素的二维数组imageUtils.loadImage(path);}} else if (ac.equals("保存")) {}else if (ac.equals("原图")) {imageUtils.drawImage();}else if (ac.equals("马赛克")) {}else if (ac.equals("灰度化")) {}}@Overridepublic void mouseClicked(MouseEvent e) {}@Overridepublic void mousePressed(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}
}
package lfx250220;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class ImageUtils {//定义一个属性 储存图片的二维数组static int[][] imgArr;//宽度和高度int w;int h;Graphics gra = null;//从绘制面板上将画笔传过来//加载图片public static void loadImage(String path){File file = new File(path);//读取文件的内容//补充://BufferedImage 可理解为一个包含图像像素数据的缓冲区 不仅储存了图像的像素信息 还包含了图像的颜色模型 透明度等属性//也可以把他看成一个二维的像素数组 每个像素都有对应的颜色值//主要作用://图像读取与储存 处理图像文件一般把BufferedImage当做中间对象 在该项目代码就是这个作用//图像编辑与处理 BufferedImage提供丰富的方法来操作图像的像素 通过修改BufferedImage的像素值 可以是实现各种图像特效//图像显示 Java中 可以将BufferedImage对象绘制到Graohics上下文上 从而在窗口中显示图像//ImageIO.read(file)方法尝试从文件File中读取图像 是Java标准库中用于读取图像文件的静态方法try {BufferedImage image=ImageIO.read(file);//获取图片的宽度和高度int w=image.getWidth();int h= image.getHeight();//创建一个空的数组 储存图片的像素值imgArr = new int[w][h];//将图片的像素值复制到数组中for (int i=0;i<w;i++){for (int j=0;j<h;j++){imgArr[i][j]=image.getRGB(i,j);//将BufferedImage对象Image中指定位置(i,j)的像素颜色取出来 并储存在二维数组}}System.out.println("加载图片完成");} catch (IOException e) {throw new RuntimeException(e);}}//绘制图像的方法public void drawImage(){//先将像素取出来for (int i=0;i<w;i++){for (int j=0;j<h;j++){int pixNum = imgArr[i][j];Color color= new Color(pixNum);gra.setColor(color);gra.fillRect(i,j,1,1);//绘制像素点}}}}
补充内容:复盘遇到的问题以及文件选择器和获取图片路径的方法
- 复盘遇到的问题
- 1 用for循环遍历数组的时候 从i= 0 即数组的第一个数开始 并且 i = 数组的长度 这会引起索引越界的问题
- 2 把按钮添加到面板上用的方法是初始化按钮面板 initBtnPanel
- 文件选择器
- JFileChooser 的使用方法
- 1创建JFileChooser 对象
- 2显示文件选择器的对话框
- 3 处理用户的选择结果 用if
package lfx250223;import javax.swing.*;public class JFileChooserExample {public static void main(String[] args) {//使用步骤// 1 创建JFileChooser对象JFileChooser jFileChooser = new JFileChooser();// 2 显示文件选择器对话框 位置nullint state = jFileChooser.showOpenDialog(null);// 3 处理用户的选择结果if (state==JFileChooser.APPROVE_OPTION){//用户点击了 打开 按钮java.io.File selectedFile = jFileChooser.getSelectedFile();//getSelectedFile() 是JFileCHooser类的一个方法//作用是获取用户在文件选择对话框中选定的文件 该方法会返回一个java.io.File 类的对象 该对象表示用户所选择的文件//java.io.File selectedFile:声明了一个 java.io.File 类型的变量 selectedFile,并把 getSelectedFile() 方法返回的文件对象赋值给它。JOptionPane.showMessageDialog(null,"你选择的文件是:"+selectedFile.getAbsolutePath());//JOptionPane:这是 Java Swing 库中的一个类,可用于创建各种对话框,像消息对话框、确认对话框等。//showMessageDialog:这是 JOptionPane 类的一个静态方法,用于显示一个消息对话框。//第一个参数 null:表示对话框的父组件,这里传入 null 意味着对话框会显示在屏幕中央。//第二个参数:是要显示的消息内容。selectedFile.getAbsolutePath() 方法会返回所选文件的绝对路径,把这个路径和提示信息拼接后作为消息内容显示在对话框里。}else if (state == JFileChooser.CANCEL_OPTION) {// 用户点击了“取消”按钮JOptionPane.showMessageDialog(null, "你取消了文件选择。");}}
}
- 获取图片路径
在inageUtils中定义一个二维数组 然后用loadImage方法【(String path)】 定义对象File 然后for遍历得到文件中图片的像素点 并且储存到二维数组中 此时用到的是image.getRGB(i,j)
【详细代码看上边】
相关文章:
美颜相机1.0
项目开发步骤 1 界面开发 美颜相机界面构成: 标题 尺寸 关闭方式 位置 可视化 2 创建主函数调用界面方法 3 添加两个面板 一个是按钮面板一个是图片面板 用JPanel 4 添加按钮到按钮面吧【注意:此时要用初始化按钮面板的方法initBtnPanel 并且将按钮添…...
Docker内存芭蕾:优雅调整容器内存的极限艺术
title: “💾 Docker内存芭蕾:优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “🩰💥📊” 当你的容器变成内存吸血鬼时… 🚀 完美内存编排示范 📜 智能内存管家脚本…...
gitlab初次登录为什么登不上去
今天又写了一次gitlab安装后,第一次登录的问题。 gitlab工作笔记_gitlab默认用户名密码-CSDN博客 因为又掉这个坑里了。 # 为什么第一次登录这么难? 第一是因为gitlab启动的时间很长,有时候以为装错了。 第二是初始密码,如果…...
单链表相关操作(基于C语言)
文章目录 单链表定义版本一(可自己选择是否含头节点)创建单链表打印单链表对单链表进行冒泡排序删除单链表中值为key的节点求单链表表长在单链表位序为i的位置插入新元素e 单链表定义 typedef struct node {int data;struct node* next; }LinkNode,*LinkList;版本一(可自己选择…...
SPRING10_SPRING的生命周期流程图
经过前面使用三大后置处理器BeanPostProcessor、BeanFactoryPostProcessor、InitializingBean对创建Bean流程中的干扰,梳理出SPRING的生命周期流程图如下...
从零到一学习c++(基础篇--筑基期十一-类)
从零到一学习C(基础篇) 作者:羡鱼肘子 温馨提示1:本篇是记录我的学习经历,会有不少片面的认知,万分期待您的指正。 温馨提示2:本篇会尽量用更加通俗的语言介绍c的基础,用通俗的语言去…...
Java String 类
Java String 类常用方法详解 在 Java 编程里,字符串操作十分常见,而 String 类作为 Java 标准库的核心类,用于表示不可变的字符序列。任何对字符串的修改操作都会返回一个新的字符串对象,不会改变原始字符串。本文将详细介绍 Str…...
P8665 [蓝桥杯 2018 省 A] 航班时间
P8665 [蓝桥杯 2018 省 A] 航班时间 题目代码分析 题目 代码 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <math.h> #include <queue>#include <cctype> using namespace std; int t;…...
Vue3项目与pnpm使用教程
文章目录 Vue3项目与pnpm使用教程一、pnpm简介二、安装pnpm三、创建Vue3项目四、运行Vue3项目五、管理项目依赖六、配置pnpm七、使用pnpm的额外功能八、总结 Vue3项目与pnpm使用教程 一、pnpm简介 pnpm是一个高性能的Node.js包管理工具,相较于npm和yarn࿰…...
C++初阶——简单实现list
目录 1、前言 2、List.h 3、Test.cpp 1、前言 1. 简单实现std::list,重点:迭代器,类模板,运算符重载。 2. 并不是,所有的类,都需要深拷贝,像迭代器类模板,只是用别的类的资源&am…...
C/C++后端开发面经
字节跳动 客户端开发 实习 一面(50min) 自我介绍是否愿意转语言,是否只愿意搞后端选一个项目来详细谈谈HTTP和HTTPS有什么区别?谈一下HTTPS加密的具体过程: 非对称加密 对称加密 证书认证的方式 非对称加密是为了保证对称密钥的安全性。 对称…...
linux 编辑器
1.三种模式 2.图例 3.wq 4.光标的使用...
【事件驱动框架OSAL】二.消息的管理机制
OSAL消息管理机制 二、消息管理机制2.1 消息的数据结构2.2 消息内存分配2.3 消息的接收和销毁2.3 源码链接地址 二、消息管理机制 在上一篇文中提到,系统消息事件(SYS_EVENT_MSG)用于任务间传递数据,而消息队列是这种机制的基础&…...
《论多源数据集成及应用》审题技巧 - 系统架构设计师
论多源数据集成及应用写作框架 一、考点概述 本论题“论多源数据集成及应用”主要考察的是计算机软件测试工程师在数据管理和集成方面的专业知识与实践能力。论题聚焦于信息爆炸时代企业、组织和个人所面临的数据挑战,特别是如何有效地收集、整理和清洗来自不同渠…...
【企业微信开发工具,获取位置】
微信开发者工具获取位置失败 报错原因解决方案 报错原因 getLocation:fail, the permission value is offline verifying解决方案 在开发工具栏输入链接,进行位置获取获取成功后,重新进入调用获取位置的页面即可如下图:...
HTML之JavaScript DOM编程获取元素的方式
HTML之JavaScript DOM编程获取元素的方式 1.获得document DOM树window.document(是window的属性)2.从document中获取要操作的元素1.直接获取var aaa document.getElementById("username") // 根据元素的id值获取页面上的唯一一个元素,有同名的则返回找到的第一个var…...
如何安装vm和centos
以下是在VMware中安装CentOS的一般步骤: 一、安装VMware 以下是在 Windows 系统中安装 VMware 软件的详细步骤: 1. 下载 VMware 软件: - 访问 VMware 官方网站(https://www.vmware.com/)。 - 根据您的操作系统选择合…...
docker 安装redis 7.4.2并挂载配置文件以及设置密码
文章目录 docker 安装redis 7.4.2下载 redis如果你喜欢使用最新的版本创建挂载redis 配置文件创建容器 docker 安装redis 7.4.2 截至2025年2月21日,Redis的最新稳定版本是 7.4.2。 下载 redis 如果你想拉取Redis的特定版本(例如最新的稳定版本 7.4.2&a…...
计算机毕业设计SpringBoot+Vue.js在线教育系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Linux-C-函数栈-SP寄存器
sp(Stack Pointer,栈指针)是计算机体系结构中一个非常重要的寄存器,下面将详细介绍其作用和原理。 作用 1. 管理栈内存 栈是一种后进先出(LIFO,Last In First Out)的数据结构,在程…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
