美颜相机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)的数据结构,在程…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...