首先来看最终效果图
美颜相机主要由多种功能组成:基本窗体,菜单栏,拉杆,灰度,二值,放大一倍,缩小一倍,以及三原色滤镜和透明度调节组成。
万丈高楼平地起,咱们先从基础款开始搞起
1.首先创建一个包,然后创建一个类,以下,我以imagepan和drawlis为例
之后咱们正式开始创建项目
首先,为了方便我们可以将imagepan类继承到JFream中(这里默认咱们已经创建了main主函数)
public class imagepan extends JFrame {}
这样就不用使用创建对象的方式调用窗体,而是直接用"this"调用即可。
- 有了窗体,我们就可以开始设置窗体的各种内容,因此我们写第一个方法。
- 首先,我们设置窗体的名称“美颜相机”
- 然后,我们设置窗体的大小、添加布局管理器(这里我们添加流式布局管理器)、添加一个按钮,按钮名称为“显示图片”(此时不需要加监听器,只需要添加按钮)
- 最后让一切设置可视化
以上,一个简单的美颜相机窗体就创建完成了
2.完成了窗体的设计,之后就是完成绘制图片逻辑的编写
接下来就要用到另一个类——drawlis
- 该类为咱们制作美颜相机的基本类,也是最关键的类
- 因为在前面的窗体设计时创建了一个按钮,所以咱们要实现点击按钮显示图片的功能,就必须加入动作监听器。
- 在加入监听器并且重写过其中的方法后,咱们正式开始写美颜相机的内容
- 我们以这张图为例,图片都是有一个个像素点组成,而像素点又是有长宽两种属性组成的方形,因此,我们可以将所有像素点转化为长和宽。
- 这里我们创建一个二维数组的类存储图片的长和宽,随后我们二次遍历,通过IO流保存图片,之后将得到的内存图片的长和宽设置为二维数组的“长和宽”
- 获得到数组的长和宽之后创建一个新的数组保存长和宽,之后二次遍历这个新的二维数组,将内存中的图片显现出来,之后返回这个新的数组
- 注意:这里我们需要用try catch来保证没有取到图片后的回馈
- 得到二维数组的类之后,咱们在重写的actionPerformed类中使用创建新的二维数组得到二维数组类中返回的新的数组的数据,也就是能显现出来的图片。
- 之后再一次进行二次遍历将像素点转换成图片,并且将每个像素点的数据赋值到画笔上,利用画圆点(也可以是方块)的方法绘制图片
以上的内容可能有些过于干燥,不过这都是本人的基本思路,大伙可以参考一下
以下附上所有代码
注意:并没有附上功能包
public class drawlis implements ActionListener {
private Graphics g;
public drawlis(Graphics g) {
this.g = g;
}
public void actionPerformed(ActionEvent e) {
int[][] ia = toArray();
for (int i = 0; i < ia.length; i++) {
for (int j = 0; j < ia[i].length; j++) {
int v = ia[i][j];
Color c = new Color(v);
g.setColor(c);
g.fillOval(i + 100, j + 100, 2, 2);
}
}
}
public int[][] toArray() {
java.io.File f = new File("mansui1.png");
try {
//得到一张内存图片
BufferedImage bi = ImageIO.read(f);
//建立二维数组
int h = bi.getHeight();
int w = bi.getWidth();
int[][] ar = new int[w][h];//获取数组的长宽
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
ar[i][j] = bi.getRGB(i, j);
}
}
return ar;
} catch (Exception ef) {
ef.printStackTrace();//固定格式
System.out.println("图片加载失败!");//打印出错误信息
}
return null;
}
}
public class imagepan extends JFrame {
public void intiUI() {
this.setTitle("美颜相机");
this.setSize(1600,1600 );
//添加布局管理器
FlowLayout fl = new FlowLayout();
this.setLayout(fl);
//添加按钮
JButton buDis = new JButton("显示相片");
this.add(buDis);
//可视化
this.setVisible(true);
//创建监听器对象
Graphics g = this.getGraphics();
drawlis dl = new drawlis(g);
buDis.addActionListener(dl);
}
public static void main(String args[]) {
imagepan ip=new imagepan();
ip.intiUI();
}
}
如果有任何疑问都可以留言提问