Java实现图片特效

1.面板的使用

2.读取图片并获取图片的二维数组
3.图片的传入及代码块的使用
4.如何快速得到图片
5.图片的一些特效实现

1.面板的使用
JFrame窗体

模版边框布局
每个方位只能加一个组件(面板)
-南北
宽度与窗体一致,不可设置
高度可以设置
-东西
高度不可设置,如果有南北组件,去掉南北组件的高度,剩下的就是东西组件的高度
宽度可以设置
-中
宽高都不可以设置,剩下多少是多少
面板的默认布局时流动布局

        JPanel jpbtn=new JPanel();
        JPanel jpimage=new JPanel();
        //给按钮面板设置一个宽度
        jpbtn.setPreferredSize(new Dimension(100,0));
        //改面板背景颜色
        jpbtn.setBackground(Color.WHITE);
        jpimage.setBackground(Color.PINK);
        //在窗体上添加面板
        //将按钮面板设为边界布局
        jf.add(jpbtn,BorderLayout.WEST);
        jf.add(jpimage);

2.读取图片并获取图片的二维数组

public int[][] getimgArr(String imgpath) {
        File file=new File(imgpath);
        //接收图片的对象
        BufferedImage bufimage=null;
        try{
        bufimage= ImageIO.read(file);}
        catch (IOException e){
            throw new RuntimeException(e);
        }
        // 获取图片对应的二维数组
       int imgArr[][]=new int[bufimage.getWidth()][bufimage.getHeight()];
        for(int q=0;q<imgArr.length;q++){
            for(int w=0;w<imgArr[0].length;w++){
                imgArr[q][w]=bufimage.getRGB(q,w);
            }
        }
 
      return imgArr;
    }

3.图片的传入及代码块的使用

程序一旦运行,代码块就执行

 {String path1="picture/131665156357_.pic.jpg";
    String path2="picture/141665156358_.pic.jpg";
    imgArr1=imagetools.getimgArr(path1);
    imgArr2=imagetools.getimgArr(path2);
    }

4.如何快速得到图片

如果绘制原图,则初级绘制方法为一个像素块一个像素块画矩形

public void drawImage(int[][]imageArr, Graphics g){
        for(int q=0;q<imageArr.length;q++){
            for(int w=0;w<imageArr[q].length;w++){
                int mix=imageArr[q][w];
                Color color=new Color(mix);
                g.setColor(color);
                g.fillRect(x+q,y+w,1,1);}}}

如果可以先先获取每一个像素块对应的数组,最后一次性画出,那么图片获取速度就会变快

 public void drawImage(Graphics g,int[][]imgArr){
        //创建一个bufferedimage对象
        BufferedImage buffing=new BufferedImage(imgArr.length,imgArr[0].length,BufferedImage.TYPE_INT_ARGB);
        for(int a=0;a<imgArr.length;a++){
            for(int b=0;b<imgArr[0].length;b++){
                int img=imgArr[a][b];
                Color color=new Color(img);
                //将像素值存入buffing中
                buffing.setRGB(a,b,img);
              //  g.setColor(color);
              //  g.fillRect(X+a,Y+b,1,1);
 
    }}
    //循环结束后,将buffing绘制出来
        g.drawImage(buffing,0,0,null);
    }

5.图片的一些特效实现

灰度图

 public void drawGrayImage(int[][]imageArr, Graphics g){
        for(int q=0;q<imageArr.length;q++){
            for(int w=0;w<imageArr[q].length;w++){
                int mix=imageArr[q][w];
                //拆rgb
                //灰度图原理r=g=b
                int red=(mix>>16)&255;
                int green=(mix>>8)&255;
                int blue=(mix>>0)&255;
                Color color=new Color(red,red,red);
                g.setColor(color);
                g.fillRect(x+q,y+w,1,1);
            }
        }
    }

二值化

 public void drawBinaryImage(int[][]imageArr,Graphics g){
        for(int q=0;q<imageArr.length;q++){
            for(int w=0;w<imageArr[q].length;w++){
                int mix=imageArr[q][w];
                int red=(mix>>16)&255;
                int green=(mix>>8)&255;
                int blue=(mix>>0)&255;
                //用green是否大于100做二分
                if(green<100){
                    g.setColor(Color.BLUE);
                }
                else{g.setColor(Color.WHITE);}
                g.fillRect(x+q,y+w,1,1);
            }
        }
 
 
    }

马赛克

public void drawMosaicImage(int[][]imageArr,Graphics g){
        for(int q=0;q<imageArr.length;q+=10){
            for(int w=0;w<imageArr[q].length;w+=10){
                //采样间距由1变为10
                int mix=imageArr[q][w];
                Color color=new Color(mix);
                g.setColor(color);
                g.fillRect(x+q,y+w,10,10);
                //改采样间距的时候记得改小矩形的宽高
            }
        }
 
 
    }

图片融合

注意三元运算符的使用

public void drawmixImage(Graphics g,int[][] imageArr,int[][] imageArr2){
        //需要比较两张图片的宽高
        //三元运算符
        int w=imageArr.length<imageArr2.length?imageArr.length:imageArr2.length;
        int h=imageArr[0].length<imageArr2[0].length?imageArr[0].length:imageArr2[0].length;
        //取小的宽和高
        for(int a=0;a<w;a++){
            for(int b=0;b<h;b++){
                int mix1=imageArr[a][b];
                int red1=(mix1>>16)&255;
                int green1=(mix1>>8)&255;
                int blue1=(mix1>>0)&255;
 
                int mix2=imageArr2[a][b];
                int red2=(mix2>>16)&255;
                int green2=(mix2>>8)&255;
                int blue2=(mix2>>0)&255;
                //均值法
                int red=(red1+red2)/2;
                int green=(green1+green2)/2;
                int blue=(blue1+blue2)/2;
                Color color=new Color(red,green,blue);
                g.setColor(color);
                g.fillRect(X+a,Y+b,1,1);
 
    }
}}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值