【java程序学习】从零开始编写美颜相机程序——第二讲

首先来看最终效果图

在这里插入图片描述
美颜相机主要由多种功能组成:基本窗体,菜单栏,拉杆,灰度,二值,放大一倍,缩小一倍,以及三原色滤镜和透明度调节组成。

万丈高楼平地起,咱们先从基础款开始搞起

在上节课的基础上,咱们继续添加更多需要的零部件

上节课链接: https://blog.csdn.net/ecplice123/article/details/141828274?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522DC2734F2-268B-45E0-A240-A72C12AD791D%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=DC2734F2-268B-45E0-A240-A72C12AD791D&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-141828274-null-null.142v100pc_search_result_base1&utm_term=%E3%80%90java%E7%A8%8B%E5%BA%8F%E5%AD%A6%E4%B9%A0%E3%80%91%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%BC%96%E5%86%99%E7%BE%8E%E9%A2%9C%E7%9B%B8%E6%9C%BA%E7%A8%8B%E5%BA%8F%E2%80%94%E2%80%94%E7%AC%AC%E4%B8%80%E8%AE%B2&spm=1018.2226.3001.4187

在有了基本的窗体和基本的类之后,我们可以开始创建需要的功能了。

灰度与二值

首先来看效果图
在这里插入图片描述
在这里插入图片描述

  • 我们依旧以满穗的图片为例

  • 大家可能会注意到,窗体并没有完全呈现图片,这个问题只需要在绘画像素点时将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;

    }
}

如果有任何疑问都可以留言提问

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值