JAVA PC端美颜相机

这是我在蓝杰做的第一个项目:PC端美颜相机。这个小程序的本质就是对一张图像做处理。存储在计算机的图像信息实际上是一个个像素点,不同的像素点有不同的rgb值,修改像素点的rgb值我们就可以将图像处理成我们想要的效果。

 

首先我们需要创建一个图形界面作为我们美颜相机的程序界面,来显示图片和功能按钮。这里就需要用到Swing组件里的JFrame,JPanel,JButton等类.这是整个软件UI界面的代码:

           
                    

   public class Ui {
         public static void main(String[] args) {
             Ui ui=new Ui();
             ui.showui();
         }
         public void showui() {
            //图像处理界面
                    JFrame jf = new JFrame();
                    jf.setSize(700, 800);
                    jf.setTitle("图像处理");
                    jf.setLocationRelativeTo(null);
                    jf.setDefaultCloseOperation(3);
                    //FlowLayout flow =new FlowLayout();
                    //jf.setLayout(flow);
                    JPanel jp_1 = new JPanel(); 
                    jp_1.setBackground(Color.DARK_GRAY); 
                    Dimension dim = new Dimension(120,0); 
                    jp_1.setPreferredSize(dim);
      
                    Dimension btndim = new Dimension(110,35);
                    
                    PixelMouse mouse = new PixelMouse();
                    String[] butt={"原图","马赛克","灰度","二值化","轮廓检测","手 绘风格" ,"镜像","锐化","撤回"};
                    //给窗体添加鼠标监听器方法
                    for(int i=0;i<butt.length;i++) {
                        JButton dd=new JButton(butt[i]);
                        dd.setPreferredSize(btndim);
                    }
                    
                    // 绘图区 
                    Drawpanel panelDraw = new Drawpanel(); 
                    panelDraw.setBackground(Color.BLACK); 
                    jf.add(jp_1,BorderLayout.EAST); 
                    jf.add(panelDraw,BorderLayout.CENTER);
                    jf.setVisible(true);
                    //jp_2.addMouseMotionListener(mouse); 
                    //jp_2.addKeyListener(mouse);
                    //从jp2获取画笔
                    //获取画笔
                    Graphics gr = panelDraw.getGraphics();

 

                    mouse.setj(panelDraw);
                    panelDraw.addMouseListener(mouse); 
                    panelDraw.addMouseMotionListener(mouse); 
                
                    
         }
}

我们这里设计了几个功能按钮:"原图","马赛克","灰度","二值化","轮廓检测","手 绘风格" ,"镜像","锐化","撤回"。为这几个按钮添加动作监听器才能获得想要的效果。动作监听器的实现是继承抽象类然后重写抽象方法实现的。点击原图时我们要显示预先选定的图片,在这个过程中,我们要先使用IO流读取图片并存储到缓冲图片中,然后创建二维数组并把像素点的rgb值存储到二维数组中。

通过下面这个方法我们可以获得存储图像信息的二维数组。

 public int[][] GetImagepixel(String path){
        File file=new File(path);
        BufferedImage buffImage = null; 
        try {
            buffImage = ImageIO.read(file);
        } catch (IOException c) {
            c.printStackTrace();
        }
        int w=buffImage.getWidth();
        int h=buffImage.getHeight();
        int[][] arrpixel = new int[w][h];
        for(int i=0;i<w;i++) {
            for(int j=0;j<h;j++) {
                arrpixel[i][j]=buffImage.getRGB(i, j);
            }
        }
        //System.out.println("arrr");
        return arrpixel;
    }

接下来判断触发动作监听器的是哪个按钮,这一步可以借助e.getActionCommand()实现,这里要注意,e.getActionCommand()会返回按钮上的字符串,而e.getSource返回的是按钮JButton对象.在比较返回的字符串时不可以用==判断,要用e.equals,因为==比较的是两个字符串的内存地址,而不是字符串的内容。

if("原图".equals(e.getActionCommand())) {
                    System.out.println("原图");
                    for(int i=0;i<arrPixel.length;i++){
                        for(int j=0;j<arrPixel[i].length;j++){
                            int pixel = arrPixel[i][j];
                            //Color color = new Color(pixel);
                            //设置画笔为当前颜色
                            buffing.setRGB(i, j,pixel);
                            //g.setColor(color);
                //画像素点
                }}

这样就实现了一个按钮监听器,其余的按钮监听器的功能可以照此实现。这里有个小技巧,就是画图时如果是将二维数组直接画在画布上会有一个刷新的过程,我们可以先画在缓冲图像BufferedImage上,然后再使用Graphics类的drawImage方法把缓冲图像画在画布上。画笔需要从UI界面先获取再传送到动作监听器中,获取画笔对象的代码要在setvisible代码下方,不然会出现空指针异常。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值