使用图片时,总是容易大小不匹配,一招教你解决它!!!
诚然,java内置了图片缩放功能,但是自己写的话,更能契合所使用情景,而且会觉得自己贼牛!!!
1.得到图片的RGB值:
public int[][] getRGB(String path){
File file = new File(path);
BufferedImage buff=null;
try {
buff = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
int[][] arr = new int[buff.getWidth() ][buff.getHeight() ];
for (int i = 0; i < buff.getWidth() ; i++) {
for (int j = 0; j < buff.getHeight() ; j++) {
arr [i][j] = buff.getRGB(i ,j );
}
}
return arr;
}//得到缓存图片的RGB,
我们先通过缓存图片得到图片内容,在用缓存图片得到RGB值,并将其存在二维数组中。
2.得到图片处理后的缓存图片
我们缩放的思路是,先将图片边长扩大5倍,然后算出所需的最终图片中一个像素点,需要扩大图片的几个像素点,将他们的RGB取平均值,再存入一个新的数组,再利用缓存图片存入。
1.先将图片RGB值,放入边长放大5倍的数组里
int[][] arrBig = new int[5 * arr.length][5 * arr[0].length];
for (int i = 0; i < arrBig.length; i++) {
for (int j = 0; j < arrBig[0].length; j++) {
arrBig[i][j] = arr[i / 5][j / 5];
}
}
2.处理好图片放入和所需尺寸的新数组里
for (int i = 0; i / widthNum < width ; i+= widthNum) {
for (int j = 0; j / heightNum < height; j+= heightNum) {
for (int k = 0; k < widthNum ; k++) {
for (int l = 0; l < heightNum; l++) {
depart(arrBig[i+k][j+l]);
red += r;
green += g;
blue +=b;
}
}
red/= area;
green/= area;
blue/= area;
arrVary[i / widthNum][j / heightNum ] = addAll(red,green,blue);
red = 0;
green = 0;
blue = 0;
}
}
我们在这里要注意:
1.由于widthNum,heightNum(一个像素点所需放大图片的横纵像素点的个数),是被我们转换为了int值,故会有一部分数据的损失,因此极其容易越界!!!
2.这里我们借助了四层循环,可以仔细想想其中的逻辑,即先用双层循环,将数组变成以widthNum,heightNum为一个单元格宽高的数组,再用双层循环遍历这个单元格内的所有数组,从而达到我们取RGB平均值的目的。
3.RGB值的平均值并非是简单的相加后除以个数,而是要将其中的r,g,b拆分,再合成我们所需的RGB值
拆分与合成方法如下(利用到了位运算):
public void depart(int RGB){
r = (RGB>>16)&255;
g = (RGB>>8)&255;
b = (RGB>>0)&255;
}
public int addAll(int red,int green,int blue){
int RGB = (red<<16) + (green<<8) + blue;
return RGB;
}
3.在paint函数中,将处理后的图片绘制出:
@Override
public void paint(Graphics g){
super.paint(g);
BufferedImage buff = vary(getRGB("C:\\Users\\27259\\Desktop\\background.png"),
600,400);
g.drawImage(buff,0,0,null);
}
效果如下:
扫描二维码关注公众号,回复:
14796807 查看本文章
嘻嘻嘻嘻!!!完成了