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值,最后将其绘制出来那么最终就会形成一个合成图片的形式