一、程序目的
可以完成选择存储的图片并加载,显示原图;对图片马赛克处理,黑白或灰度处理以及修改图片色调等功能。下面先给大家演示最终效果



朋友们心动了吗,下面教大家这款相机的构建,只需一百余行代码,带你从零开始玩转图片——
二、实现操作
1、创建一个包(以下以cameraPro为例),并创建一个类(以下为Camera IO),在该类中创建一个方法”ShowUI“,在下方创建主函数main,主函数中创建一个关于CameraIO的对象,对其调用ShowUI方法。
package CameraPro;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import java.awt.*;
public class CameraIO {
public void ShowUI(){
}
public static void main(String[] args) {
CameraIO camera=new CameraIO();
camera.ShowUI();
}
}
2、构建窗体,使用JFrame创建窗体,并设置其标题(以美颜相机为例)、窗体大小、位置、结构(常用流式结构)、关闭方式、可见性
package CameraPro;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import java.awt.*;
public class CameraIO {
public void ShowUI(){
JFrame jf=new JFrame("美颜相机v1.5");
jf.setSize(800,700);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout flow=new FlowLayout();
jf.setLayout(flow);
jf.setVisible(true);
}
public static void main(String[] args) {
CameraIO camera=new CameraIO();
camera.ShowUI();
}
}
3、加载按钮,使用JButton创建按钮,setText对其设置按钮文字,用于表明该按钮功能。
package CameraPro;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import java.awt.*;
public class CameraIO {
BtnListener listener=new BtnListener();
TwoPicture tp=new TwoPicture();
public void ShowUI(){
JFrame jf=new JFrame("美颜相机v1.5");
jf.setSize(800,700);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout flow=new FlowLayout();
jf.setLayout(flow);
JButton btn=new JButton();
btn.setText("加载图片");
jf.add(btn);
jf.setVisible(true);
}
public static void main(String[] args) {
CameraIO camera=new CameraIO();
camera.ShowUI();
}
}
注:可通过复制粘贴来加载多个按钮,只需修改文本内容即可,千万记得修改按钮名称(btn,btn1···)
4、添加动作监听器用于监听按钮动作触发,使用ActionListener监听,创建一个新的类在同一包内,加载actionPerformed
public class BtnListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String BtnText=e.getActionCommand();
System.out.println("点击了"+BtnText);
}
}
在主页面中创建BtnListener的对象,对按钮(btn)调用监听方法,内容为该对象
BtnListener listener=new BtnListener();
btn.addActionListener(listener);
5、创建画布Graphics,创建别名,画布对象在监听器中调用该别名
Graphics g=jf.getGraphics();
listener.g2=g;
//在监听器中
Graphics g2;
6、获取图片
主要使用File类加载地址,ImageIO类读取图片数据,BufferedImage类存储图片数据
在监听器中创建一个新的方法(以GetPic为例)
(为简化操作,ImageIO方法对”read“进行自动生成try-catch)
BufferedImage img;
int w,h;
public void GetPic(String path){
File fl=new File(path);
try {
img= ImageIO.read(fl);
w=img.getWidth();
h=img.getHeight();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
7、图片的操作
该步骤为美颜相机项目的主要步骤,在此以加载原图与灰度图为例简单向读者介绍,其他颜色处理见仁见智,朋友们也可以提出不同的操作方法
(1)加载原图
图片加载过程为:从读取的文件获取像素点(使用双层循环嵌套用于遍历读取图片的像素点),将像素点转为颜色,将颜色提供给画笔,用画笔花在画布上
public void drawImage() {
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
// 获取对应矩阵上的像素点值
int rgb = img.getRGB(i, j);
// 将像素值转为 颜色对象
Color color = new Color(rgb);
// 设置给画笔
g2.setColor(color);
// 绘制当前像素点
g2.fillRect(X + i, Y + j, 1, 1);
}
}
(2)加载灰度图
将色彩设置为灰色(或者其他色调),关键在于对RGB值的操作
在前一步对原图的获取上提取其中的红,绿,蓝三原色,对其进行运算,并将新的三色赋值给画笔,从而实现图片色调的变化
public void drawBinaryImage() {
for (int i = 0; i < w; i += 1) {
for (int j = 0; j < h; j += 1) {
// 获取对应矩阵上的像素点值
int rgb = img.getRGB(i, j);
// 将像素值转为 颜色对象
Color color = new Color(rgb);
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
int gray = (red + blue + green) / 3;
Color bcolor = new Color(gray,gray, gray);
g2.setColor(bcolor);
// 绘制当前像素点
g2.fillRect(X + i, Y + j, 1, 1);
}
}
}
总结:
整个项目的操作内容较为简单,但充满细节,特别是在接下来的不同功能实现阶段,极其容易调用不正确的方法或者非对应对象而导致无法产生预期效果,要特别注意在每个阶段将该部分中的细节考虑全面,从而实现整个美颜相机的顺畅运行。
另注:
以上为新手入门版本的代码,整个程序还可以进行不同程度的优化,请朋友们按照自己的能力进行。下面为大家提供一个利用一维数组快速生成所需全部按钮的优化方案,以起到抛砖引玉的效果。
String[] BtnName={"获取图片","原图","马赛克","双色","怀旧","暖色调","冷色调","叠加","二值化","轮廓画"};
for(int i=0;i<BtnName.length;i++){
String name=BtnName[i];
JButton btn=new JButton();
btn.setText(name);
btn.setBackground(Color.white);
btn.addActionListener(listener);
btn.addActionListener(tp);
jf.add(btn);
}
将按钮名称列入一维数组,依次生成按钮,并将其添加到按钮上。
此外,还有JFileChooser选择图片文件,switch-case条件选择等优化方案,在此不一一列举。
希望大家可以从零开始完成属于自己的美颜相机,开始程序之路!