画板开发与图像处理

界面

程序登录界面

想做一个有图像处理功能的画板,首先需要一个简易的登陆界面。
在这里插入图片描述如图是简易的登录界面,输入正确的账号密码即可进入画图板界面。

 JFrame weixin=new JFrame();
     weixin.setTitle("画图板");
     weixin.setSize(300, 400);
     weixin.setLocationRelativeTo(null);
     FlowLayout fl=new FlowLayout();
     weixin.setLayout(fl);
     weixin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     ImageIcon image =new ImageIcon("C:\\Users\\10977\\Desktop\\timg1.jpg");
     JLabel ax=new JLabel(image);
     JLabel ay=new JLabel("账号");
     JTextField name=new JTextField();
     JLabel az=new JLabel("密码");
     JPasswordField pwf=new JPasswordField();
     JButton aw=new JButton("登录");
     Dimension dl=new Dimension(220,30);
     name.setPreferredSize(dl);
     pwf.setPreferredSize(dl);
     weixin.add(ax);
     weixin.add(ay);
     weixin.add(name);
     weixin.add(az);
     weixin.add(pwf);
     weixin.add(aw);
     weixin.setVisible(true);
     listener lk=new listener();
     lk.zh=name;
     lk.mm=pwf;
     lk.k=k;
  aw.addActionListener(lk);
        lk.weixin=weixin;

如图是窗体界面,具体说明我在上一篇文章有讲过,这里就不详细介绍了。
唯一注意的一点是关于登录成功弹出新界面的交互。我们需要用JFframe.DISPOSE_ON_CLOSE,当登陆失败时,我们利用窗口提醒用户还有几次登陆机会,否则退出登陆界面
在这里插入图片描述
这里我们对弹出窗体的关闭相应用DISPOSE,否则将关闭整个程序。
在这里插入图片描述
如上是登录代码的运行过程。

画图板界面

当登陆成功后我们就进入画图板界面
如下是登陆界面跳转至画图板界面的代码。

if(zh1.equals("123")&&mm1.equals("567")){
   System.out.println("登陆成功");
             weixin.dispose();
             DrawFrame df=new DrawFrame();
             df.ht();//登录画图板界面

在这里插入图片描述
可以看到有比较分明的布局,这次我们用的布局器不同于上一次,这次使用的是边框布局器。边框布局器分为南北中东西四个部分。当窗体不添加东西南北部时,其他统一视为中部。

 BorderLayout fl=new BorderLayout();//边框布局器
  JPanel funj=new JPanel(); //面板
  JPanel paintj=new JPanel();
  paintj.setBackground(Color.WHITE);
  dframe.setLayout(fl);

JPanel是一种容器,可以装纳所有组件,同样的,窗体也是容器,并且是顶级容器。dframe.add(funj,BorderLayout.NORTH); dframe.add(paintj,BorderLayout.CENTER);
如上是将面板加入窗体中。我们可以用setpreferredsize调整面板大小。
可以看到窗体顶部有几个选项。这种由多个选项组成的栏目称为菜单栏。

filechooser fc=new filechooser();
    JMenuBar jmr=new JMenuBar();
   JMenu jm1=new JMenu("壁纸");
   JMenu jm2=new JMenu("分形");
   JMenu jm3=new JMenu("还原");
   JMenu jm4=new JMenu("图片美颜");
   jmr.add(jm1);
   jmr.add(jm2);
   jmr.add(jm3);
   jmr.add(jm4);
   JMenuItem jmz=new JMenuItem("导入");
   JMenuItem rongz=new JMenuItem("熔铸滤镜");
   JMenuItem manhua=new JMenuItem("漫画滤镜");
   jm4.add(jmz); 
   jmz.addActionListener(fc);
   JMenuItem jmx=new JMenuItem("原图");
   jm4.add(jmx);
   JMenuItem jmw=new JMenuItem("灰白");
   jm4.add(jmw);
   jmw.addActionListener(fc);
   jm4.add(rongz);
   jm4.add(manhua);
   manhua.addActionListener(fc);
   rongz.addActionListener(fc);
   jmx.addActionListener(fc);
   JMenuItem jms=new JMenuItem("白板");
   JMenuItem jmp=new JMenuItem("蓝色");
   JMenuItem jml=new JMenuItem("红色");
   jm3.add(jms);
   jm3.add(jmp);
   jm3.add(jml);
   JMenuItem jmk=new JMenuItem("枫叶");
   JMenuItem jmq=new JMenuItem("树叶");
   jm2.add(jmk);
   jm2.add(jmq);
   dframe.setJMenuBar(jmr);
   JMenuItem jmi=new JMenuItem("原图");
   jm1.add(jmi);
   JMenuItem jmc=new JMenuItem("灰白");
   jm1.add(jmc);
   JMenuItem jmd=new JMenuItem("模糊");
   jm1.add(jmd);
   show sh=new show();
   dframe.setJMenuBar(jmr);
   jmi.addActionListener(sh);
   jms.addActionListener(ln);
   jmp.addActionListener(ln);
   jml.addActionListener(ln);
   jmc.addActionListener(sh);
   jmd.addActionListener(sh);
   jmk.addActionListener(ln);
  jmq.addActionListener(ln);

菜单栏的所有代码,单个栏目称为菜单,菜单中个体内容称为菜单项。
值得注意的是我们在使用边框布局器后,对画布的引用不能再是整个窗体,而是布局中的某个部分,如中部。不然画出直线不能与鼠标绘制的重合。菜单项同样使用按钮监听器进行响应。

绘图

绘画图形

可以看到画图板中最基本的图形有直线,矩形还有椭圆。
关于绘制方法
Graphics g;
g.drawLine(x1,y1,x2,y2)//直线
g.drawRect(x,y,m,n)//m,n是长和宽
g.drawOval(x,y,m,n)//m,n是半径
如下是具体代码

if(s.equals("直线")){
   g.drawLine(x1, y1, x2, y2);
         double dx=(double)(x2-x1);
         double dy=(double)(y2-y1);
         double l=Math.sqrt(dx*dx+dy*dy);
   double sin=dy/l;
      double cos=dx/l;
      int k1=js.getValue();
      for(int a=1;a<k1;a++){
     int m=(int)(sin*a);
     int n=(int)(cos*a); 
     if(m>=1||n>=1){
      g.drawLine(x1+m, y1+n, x2+m, y2+n);
     }
     else{
      k1++;
     }
       }
   x3=x2;
   y3=y2;
   x0=x1;
   y0=y1;
  
  }
  else if(s.equals("矩形")){
   g.drawRect(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
   int k1=js.getValue();
    for(int a=1;a<k1;a++){
     
     g.drawRect(x1+a, y1+a, Math.abs(x2-x1), Math.abs(y2-y1));
     
       }
  }
  else if(s.equals("椭圆")){
   g.drawOval(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1));
   int k1=js.getValue();
              for(int a=1;a<k1;a++){
     
     g.drawOval(x1+a, y1+a, Math.abs(x2-x1), Math.abs(y2-y1));
     
       }
  }

线条粗细

由于老版JAVA中没有调节线条粗细的方法,我就自定义了一种算法调整线条粗细
在这里插入图片描述
线条宽度可以理解为画多个平行曲线来增加视觉宽度,宽度越大,平行曲线越多越多
k1是线条粗度,也就是循环次数,然后我们通过循环不断画出平行直线。
在这里插入图片描述

在这里插入图片描述这里我使用了一种滤镜,叫动漫滤镜。以下是算法运行的细节。

if(file!=null){
    for(int x=0;x<dat.length;x++){
     for(int y=0;y<dat[x].length;y++){
      Color co=new Color(dat[x][y]);
      if("灰白".equals(s)){
       int a=co.getRed();
       co=new Color(a,a,a);}
      if("熔铸滤镜".equals(s)){
       int gr=co.getRed();
       int gg=co.getGreen();
       int gb=co.getBlue();
      int ngr=(int)(128*gr/(gg+gb+1));
      int ngg=(int)(128*gg/(gr+gb+1));
      int ngb=(int)(128*gb/(gr+gg+1));
      co=new Color(Math.min(ngr,255),Math.min(ngg,255),Math.min(ngb,255));
      }
      if("漫画滤镜".equals(s)){
       int gr=co.getRed();
       int gg=co.getGreen();
       int gb=co.getBlue();
       int ngr=(int)(Math.abs(2*gg+gr-gb)*gr/256);
       int ngg=(int)(Math.abs(2*gb+gr-gg)*gr/256);
       int ngb=(int)(Math.abs(2*gb+gr-gg)*gg/256);
       co=new Color(Math.min(ngr,255),Math.min(ngg,255),Math.min(ngb,255));
      }

线条颜色

在画图时我们想要转换画笔颜色,可以增加按钮,让按钮字符为空,给按钮背景设置成对应的颜色,再添加按钮监听器,即可达到转换颜色的目的

if("".equals(e.getActionCommand())){
 JButton x=(JButton)e.getSource(); 
    g.setColor(x.getBackground());

以上就是关于画图板的大致内容了,其他额外的效果也可以自己添加,我就不多提了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值