图像处理和二位进制运算
1.RGB的二进制编码:
RGB每个原色码用一个字节(8bit)二进制码表达0-255
将RGB的三个字节的二进制码存入一个int(32bit)的整数中
而如果要转化为RGB,则需要将一个int(32bit)拆分为3个字节R G B
操作:
1.直接操作这个数的二进制进行移动
右移:>>
高位缺失补零,低位被挤出则丢掉,最后保留想要的结果
左移:<<
高位被挤出的丢掉,低位缺失的补0
2.运算:二进制码的与运算
相同保留原码,不同为0
如green:
0000 0000 0000 0000 1111 1111 1011 1011&
0000 0000 0000 0000 0000 0000 1111 1111=
0000 0000 0000 0000 0000 0000 1011 1011
经过一系列操作成功提取出想要的G
int pix=14671839;
int red=(pix>>16)&0xFF;
System.out.println("Red:"+red);
int green=(pix>>8)&255;
System.out.println("Green:"+green);
int blue=(pix)&255;
System.out.println("Blue:"+blue);
2.图像处理
首先编写对于图像像素值的提取
public int[][] getPixelArray(String imgPath){
File file = new File(imgPath);
BufferedImage buffimg=null;
//通过IO读取图片
try {
buffimg=ImageIO.read(file);
} catch (IOException e) {
throw new RuntimeException(e);
}
int w=buffimg.getWidth();
int h=buffimg.getHeight();
System.out.println("w:"+w+" h:"+h);
int [][] imgArr=new int[w][h];
//对像素值进行提取
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
imgArr[i][j]=buffimg.getRGB(i,j);
}
}
//返回数组
return imgArr;
}
重写构造函数并且对像素值进行RGB提取处理
@Override
public void paint(Graphics g){
super.paint(g);
int [][] imgArr=getPixelArray("D:\\research\\uml作业\\w4图\\李老师.PNG");
for(int i=0;i<imgArr.length;i++){
for(int j=0;j<imgArr[i].length;j++){
int pix=imgArr[i][j];
int red=(pix>>16)&0xFF;
int green=(pix>>8)&0xFF;
int blue=(pix)&0xFF;
Color color = new Color(red/2,green,blue);
g.setColor(color);
g.fillRect(100+i,100+j,1,1);
}
}
}