基础滤镜实现

日常生活当中,男性或者女性朋友都会使用手机的拍照功能,想在也推出了很多相机App,那么今天我们就来看看关于这个滤镜相机的制作方法吧!!!

1、我们先写一个paint方法——绘制一个容器

public void paint(Graphics g)
{
	super.paint(g);
}

2、将我们即将要传入的图片放到二维数组里面

   public int [][] getImgArray(String path)
    {
        //创建传输需要的File对象(文件或目录的抽象表示)
        File file = new File(path);

        BufferedImage bi = null;

        //设定图像缓冲区BufferedImage
        try {
            bi = ImageIO.read(file);//ImageReader解码所提供的的File结果
            //此处有IO异常 javax.imageio
        } catch (IOException e) {
            e.printStackTrace();
        }
        //BufferedImage对象左上角坐标都是(0,0)
        int w = bi.getWidth();//返回BufferedImage的宽度
        int h = bi.getHeight();//返回BufferedImage的高度

        //创建二维数组存储BufferedImage的宽度和高度
        int [][] image = new int[w][h];
        //循环遍历
        for (int i = 0; i < w ; i++) {
            for (int j = 0; j < h ; j++) {
                int rgb = bi.getRGB(i,j);
                //返回默认 RGB 颜色模型 (TYPE_INT_ARGB) 和默认 sRGB 颜色空间中的整数像素。
                image[i][j] = rgb;
                //把获取的颜色像素赋给存储的二维数组
            }
        }
        return  image;
    }

3、创建一个成员变量(用于存储图片的二维数组)

 int [][] imgArray;
    {
        imgArray = getImgArray("D:\\dmtp\\20171011095832_49d23dd458b7446249d84fda3d4ea1c1_7.jpeg");//此处是需要处理的图片路径
		System.out.println("输入完成");
        //静态代码块在类加载的时候进行
     }

4、编写滤镜的方法

   public void filter(Graphics g)
    {
        BufferedImage bufferedImage = new BufferedImage(imgArray.length,imgArray[0].length,
                BufferedImage.TYPE_INT_ARGB);//缓冲区域
        //构造一个类型为预定义图像类型之一的BufferedImage。该图像的ColorSpace为默认的 sRGB 空间。

        for (int i = 0; i <imgArray.length ; i++) {
            for (int j = 0; j < imgArray[i].length; j++) {
                int pix_num = imgArray[i][j];
                //二位数组传给一个引用
                int red = (pix_num >> 16) &0xff;//二进制位运算 255(10) - 0xff(16)
                int green = (pix_num >> 8) &0xff;
                int blue = (pix_num >> 0) &0xff;
                int gray = (red + green +blue)/3;//??

                int newred = red +30;
                if(newred > 255)//边界判断
                {
                    newred = 255;
                }
                int grayPix = 255 << 24 | newred << 16 | green  << 8 | blue << 0;//形成新的像素值
                // 0可不写
                bufferedImage.setRGB(i,j,grayPix);
                /*
                x - 要设置的像素的 X 坐标
                y - 要设置的像素的 Y 坐标
                rgb - RGB 值
                */
            }
        }
            g.drawImage(bufferedImage,10,30,null);
        }

原图是这样的
在这里插入图片描述
处理过后的结果就是这样的
在这里插入图片描述


这边就是蓝色深了一点,绘制的图像

在这里插入图片描述

灰色滤镜
在这里插入图片描述
具体实现差别部分,也是其中的核心在于

				 int newgray = blue +30;//用于
                if(newgray > 255)//边界判断
                {
                    newgray = 255;
                }
                int grayPix = 255 << 24 | newgray << 16 | newgray  << 8 | blue << 0;

由于本张图片中的绿色green和蓝色blue居多,所以我们在此对于这两部分颜色进行特殊处理

以上就是本期内容,我们下期再见!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值