首先来看最终效果图
美颜相机主要由多种功能组成:基本窗体,菜单栏,拉杆,灰度,二值,放大一倍,缩小一倍,以及三原色滤镜和透明度调节组成。
万丈高楼平地起,咱们先从基础款开始搞起
在上节课的基础上,咱们继续添加更多需要的零部件
在有了基本的窗体和基本的类之后,我们可以开始创建需要的功能了。
灰度与二值
首先来看效果图
-
我们依旧以满穗的图片为例
-
大家可能会注意到,窗体并没有完全呈现图片,这个问题只需要在绘画像素点时将x和y同比例缩小即可缩小图片。
-
例如:
g.fillOval(i/2 + 100, j/2 + 100, 2, 2);
-
这里x与y的部分加都加一百是为了让图片在窗体偏向中心一点
继续回到imagepan类中
- 因为我们未来可能添加更多的按钮,因此一个个创建对象再添加太过于繁琐。
- 我们可以创建一维数组保存按钮的名字,之后以数组大小为循环数次,创建按钮并将数组中的名字保存进去。
-
for (int i = 0; i < name.length; i++) { JButton jbu = new JButton(name[i]); this.add(jbu); jbu.addActionListener(dl); }
之后回到drawlis类中写二值与灰度的绘制逻辑
- 在重写的动作监听方法里面,创建ra,rb,rc来保存我们获取到的图片的红,绿,蓝三原色,由于我们要处理图片,所以要设置为double。
- 再创建re来保存ra、rb、rc三色和的平均值 (这就是让图片灰色的逻辑)
- 而二值就是将图片一部分变成黑色,一部分变成白色,而其中的判断方法也是利用re来判断(这是比较简单的方法)
- 随后咱们使用
name = e.getActionCommand();
获取按钮上的名字 - 最后通过最简单的if判断语句将按钮上的字与咱们的绘制方法一一对应
以上的内容可能有些过于干燥,不过这都是本人的基本思路,大伙可以参考一下
以下附上所有代码
注意:并没有附上功能包
public void intiUI() {
this.setTitle("美颜相机");
this.setSize(1600, 1600);
//添加布局管理器
FlowLayout fl = new FlowLayout();
this.setLayout(fl);
//添加按钮z
//可视化
this.setVisible(true);
//创建监听器对象
Graphics g = this.getGraphics();
drawlis dl = new drawlis(g);
String[] name = {"灰度","显示图片","二值"};
for (int i = 0; i < name.length; i++) {
JButton jbu = new JButton(name[i]);
this.add(jbu);
jbu.addActionListener(dl);
}
}
public static void main(String args[]) {
imagepan ip=new imagepan();
ip.intiUI();
}
}
private Graphics g;
public String name;
public drawlis(Graphics g) {
this.g = g;
}
public void actionPerformed(ActionEvent e) {
name = e.getActionCommand();
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);
double ra = c.getRed();
double rb = c.getGreen();
double rc = c.getBlue();
double re = (ra + rb + rc) / 3;
if ("灰度".equals(name)) {
Color cx = new Color((int) re, (int) re, (int) re);
g.setColor(cx);
g.fillOval(i/2 + 100, j/2 + 100, 2, 2);
}
if ("显示图片".equals(name)) {
g.setColor(c);
g.fillOval(i + 100, j + 100, 2, 2);
}
if ("二值".equals(name)) {
if (re > 100) {
g.setColor(Color.black);
} else {
g.setColor(Color.white);
}
g.fillOval(i + 100, j + 100, 2, 2);
}
}
}
}
//把图片保存到数组
public int[][] toArray() {
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;
}
}
如果有任何疑问都可以留言提问