缓存图片的缩放------Java,要你多大就多大

使用图片时,总是容易大小不匹配,一招教你解决它!!!

诚然,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);
    }

效果如下:

 

 嘻嘻嘻嘻!!!完成了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值