美颜相机(java当中多种滤镜效果的实现)

1. 正常图片的绘画

	//函数作用:正常图片绘画
    public void drawzc(int arr[][],Graphics g) 
    {
    	BufferedImage bff =new BufferedImage(arr.length,arr[0].length,BufferedImage.TYPE_INT_RGB);
        Graphics ng =bff.getGraphics();
    	for(int i=0;i<arr.length;i++) 
    	{
    		for(int j=0;j<arr[0].length;j++) 
    		{
    			int pixel =arr[i][j];
    			//bff.setRGB(i, j, pixel);
    			//会将(0101010101010101....)这种二进制模式的数字,转换成为(r,g,b)的形式
    			
    			Color color =new Color(pixel);
    			//一个点一个点的绘画就会让绘画变得很慢
    			ng.setColor(color);
				ng.drawLine(i, j, i, j);
    		}
    	}
		g.drawImage(bff, 0, 0,null);
    }

1.1缓冲图片和缓冲区的理解

一: 如果不使用一个 BufferedImage这样的类,那么图片会慢慢的出现在屏幕当中
当使用缓冲区的时候,我们先将图片的各种像素画在缓冲区当中,最后一次性的传输给电脑的屏幕,那样的话,电脑上就会一次性出现图片本身
二: 我们可以理解这样的过程是,因为图片像素的列遍是循环进行的,如果我们直接画的话就相当于是一点点的传输数据。但当我们使用缓冲区,那么就相当于在传输口哪里储存一定的数据的量以后,当达到某个值的时候,我们再将整体的数据全部传递给电脑
三:就相当于是直接用水龙头来给水缸接水,还是先用水桶储存一定的水量以后直接给水缸接水

1.2 drawImage函数作用

g.drawImage(参数1:缓冲图片,参数2:图片的x坐标,参数3:图片的y坐标,null)
作用:将绘画在缓冲区上的图片呈现在屏幕上

1.3 正常图片呈现

在这里插入图片描述

2.马赛克的绘制

    public void drawMsk(int arr[][],Graphics g) 
    {
        BufferedImage bff =new BufferedImage(arr.length,arr[0].length,BufferedImage.TYPE_INT_RGB);
        Graphics ng =bff.getGraphics();
		//画出马赛克矩阵
		for(int i=0;i<arr.length;i+=10) 
		{
			for(intms j=0;j<arr[0].length;j+=10) 
			{
				int pixel =arr[i][j];
				Color color =new Color(pixel);
				//因为从哪里获取的画笔,它的绘画就会在哪里进行
				//用从缓冲图片中获取的像素,在进行绘画相当于将缓冲图片全部绘画完成
				ng.setColor(color);
				ng.fillRect(i, j, 10, 10);
			}
		}
		g.drawImage(bff, 0,0,null);
    }

2.1马赛克绘制原理讲解

马赛克的实现可以理解成,我们在宽和高的图片像素上面都每隔十个点取一个像素点,然后用将该像素点的值,作为100个像素点位置的值,用ng.fillRect(i,j,10,10)来实现
使得下图每次都是左上角的像素点的值来填充100个像素点的位置
在这里插入图片描述

2.2 马赛克图片的呈现

在这里插入图片描述

3.灰度图片的绘制

    public void drawhd(int arr[][],Graphics g) 
    {
        BufferedImage bff =new BufferedImage(arr.length,arr[0].length,BufferedImage.TYPE_INT_RGB);
        Graphics ng =bff.getGraphics();
    	for(int i=0;i<arr.length;i++) 
    	{
    		for(int j=0;j<arr[0].length;j++) 
    		{
    			int pixel =arr[i][j];
    			Color color =new Color(pixel);
    			//(r,g,b)
    			int red =(int)(color.getRed()*0.299);
    			int green =(int)(color.getGreen()*0.587);
    			int blue =(int)(color.getBlue()*0.114);
    			Color newcolor =new Color(red+green+blue,red+green+blue,red+green+blue);
    			ng.setColor(newcolor);//获取的是
    			ng.drawLine(i, j, i, j);
    		}
    	}
    	g.drawImage(bff,0,0,null);
    }

3.1灰度原理的讲解

就是当将图片当中的rgb值取一定的系数获取red,green,和blue的值,最后在将它们相加给新的color选项
int red =(int)(color.getRed()*0.299);
int green =(int)(color.getGreen()*0.587);
int blue =(int)(color.getBlue()*0.114);
Color newcolor =new Color(red+green+blue,red+green+blue,red+green+blue)

3.2灰度图片效果呈现

在这里插入图片描述

4.底片效果的绘制

    public void drawdp(int arr[][],Graphics g) 
    {
    	BufferedImage bff =new BufferedImage(arr.length,arr[0].length,BufferedImage.TYPE_INT_BGR);
    	Graphics ng = bff.getGraphics();
    	
    	for (int i=0;i<arr.length;i++) 
    	{
    		for (int j=0;j<arr[0].length;j++) 
    		{
    			int pixel =arr[i][j];
    			int newpixel =255-pixel;
    			Color color =new Color(newpixel);
    			ng.setColor(color);
    			ng.drawLine(i, j, i,j);
    		}
    	}
    	g.drawImage(bff, 0, 0,null);
    }

4.1底片效果绘制原理

			int pixel =arr[i][j];
			int newpixel =255-pixel;
			Color color =new Color(newpixel);

4.2底片效果图片展示

在这里插入图片描述

5.油画效果

public void drawyh(int arr[][],Graphics g) 
{
	BufferedImage bff =new BufferedImage(arr.length,arr[0].length,BufferedImage.TYPE_INT_BGR);
	Graphics ng =bff.getGraphics();
	for(int i=0;i<arr.length;i++) 
	{
		for(int j=0;j<arr[0].length;j++) 
		{
			int pixel =arr[i][j];
			Color color =new Color(pixel);
			ng.setColor(color);
			Random random =new Random();
			//这行代码的意思就是取一个20以下的数字  再加上5
			int r =random.nextInt(20)+10;
			ng.fillOval(i, j, r, r);
		}
	}
	g.drawImage(bff, 0, 0, null);
}

5.1 油画原理

			Random random =new Random();
			//这行代码的意思就是取一个20以下的数字  再加上5
			int r =random.nextInt(20)+10;
			ng.fillOval(i, j, r, r);
			创建一个 random实例,获得一个20以下的整数然后在加上10,最终在i,j的位置上,画取r*r大小的椭圆

5.2 油画效果展示

在这里插入图片描述

6. 黑白效果的实现

    public void black_white(int arr[][],Graphics g) 
    {
    	BufferedImage bff =new BufferedImage(arr.length,arr[0].length,BufferedImage.TYPE_INT_BGR);
    	Graphics ng =bff.getGraphics();
    	for(int i=0;i<arr.length;i++) 
    	{
    		for (int j=0;j<arr[0].length;j++) 
    		{
    			int pixel =arr[i][j];
    			Color color =new Color(pixel);
    			int r=color.getRed();
    			int green=color.getGreen();
    			int b =color.getBlue();
    			int val =(r+green+b)/3;
    			if(val>100) 
    			{
    				ng.setColor(Color.BLACK);
    			}
    			else 
    			{
    				ng.setColor(Color.white);
    			}
    			ng.drawLine(i, j, i, j);
    		}
    	}
    	g.drawImage(bff, 0, 0,null);
    }

6.1黑白效果的实现原理

			int pixel =arr[i][j];
			Color color =new Color(pixel);
			int r=color.getRed();
			int green=color.getGreen();
			int b =color.getBlue();
			int val =(r+green+b)/3;
			if(val>100) 
			{
				ng.setColor(Color.BLACK);
			}
			else 
			{
				ng.setColor(Color.white);
			}
			ng.drawLine(i, j, i, j);
		}

就是当 r,g,b相加的值/3大于100以后我们理解为这个点的像素点是偏亮的点,那么我们将其绘画为白色,反之我们将其设置为黑色

6.2 黑白图片展示

在这里插入图片描述

7. 珠纹效果的实现

    public void drawzw(int arr[][],Graphics g) 
    {
        BufferedImage bff =new BufferedImage(arr.length,arr[0].length,BufferedImage.TYPE_INT_RGB);
        Graphics ng =bff.getGraphics();
    	for(int i=0;i<arr.length;i+=10) 
    	{
    		for(int j=0;j<arr[0].length;j+=10) 
    		{
    			int pixel =arr[i][j];
    			Color color =new Color(pixel);
    			ng.setColor(color);
    			ng.fillOval(i, j, 8, 8);
    		}
    	}
		g.drawImage(bff, 0, 0,null);
    }

7.1珠纹实现原理

	for(int i=0;i<arr.length;i+=10) 
	{
		for(int j=0;j<arr[0].length;j+=10) 
		{
			int pixel =arr[i][j];
			Color color =new Color(pixel);
			ng.setColor(color);
			ng.fillOval(i, j, 8, 8);
		}
	}

7.2珠纹图片展示

在这里插入图片描述

8. 合成图片的实现

    public void compound(int arr1[][],int arr2[][],Graphics g) 
    {
    	BufferedImage bff =new BufferedImage(arr1.length,arr1[0].length,BufferedImage.TYPE_INT_BGR);
    	Graphics ng =bff.getGraphics();
    	for(int i=0;i<arr1.length;i++) 
    	{
    		for(int j=0;j<arr1[0].length;j++) 
    		{
    			if(arr2.length>i && arr2[0].length>j)
    			{
    			int pixel1=arr1[i][j];
    			int pixel2=arr2[i][j];
    			Color color1 =new Color(pixel1);
    			Color color2 =new Color(pixel2);
    			int r1=color1.getRed();
    			int r2=color2.getRed();
    			int r=(int)(r1*0.7+r2*0.3);
    			int g1=color1.getGreen();
    			int g2=color2.getGreen();
    			int green=(int)(g1*0.7+g2*0.3);
    			int b1=color1.getBlue();
    			int b2=color1.getBlue();
    			int b=(int)(b1*0.7+b2*0.3);
    			Color newcolor =new Color(r,green,b);
    			ng.setColor(newcolor);
    			ng.drawLine(i, j, i, j);
    			}
    			else 
    			{
    				int pixel1 =arr1[i][j];
    				Color newcolor= new Color(pixel1);
    				ng.setColor(newcolor);
    				ng.drawLine(i, j, i, j);
    			}
    		}
    	}
    	g.drawImage(bff, 50, 50,null);
    }

8.1合成图片原理

		Color color1 =new Color(pixel1);
			Color color2 =new Color(pixel2);
			int r1=color1.getRed();
			int r2=color2.getRed();
			int r=(int)(r1*0.7+r2*0.3);
			int g1=color1.getGreen();
			int g2=color2.getGreen();
			int green=(int)(g1*0.7+g2*0.3);
			int b1=color1.getBlue();
			int b2=color1.getBlue();
			int b=(int)(b1*0.7+b2*0.3);

其实就是获取两个图片的像素矩阵之后,然后将其rgb值分别乘以一定的比例系数,然后相加赋值给新的rgb值,最后将其绘制出来那么最终就会形成一个合成图片的形式

8.2合成图片的展示

在这里插入图片描述

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值