安卓,图片缩放和压缩

博客介绍了图片缩放原理,即将图片置于二维平面坐标系,缩放是图片所有点坐标的缩放,等比例缩放需保证宽高和原始宽高比例不变。还提及核心参数、方法及代码思路,图片宽高缩放使用createBitmap(),要将图片转成bitmap并获取宽高比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理:图片缩放的原理,我的理解,就是把图片放在一个二维平面坐标系里,图片的缩放,其实是图片所有点的坐标缩放。

等比例缩放,就是设定宽高和原始宽高的比例不变。scale=destnation/old;

方法

核心参数:原始宽高,设定宽高,设定宽高与原始宽高的比例。

核心方法:

matrix.postScale(scale_w, scale_h);
Bitmap dstbmp = Bitmap.createBitmap(bitmap, 0, 0, old_w, old_h, matrix,true);

默认以左上角(0,0)为原点。

缩放示意图

 

核心代码:

        //decode to bitmap
        Bitmap bitmap = BitmapFactory.decodeFile(path);

        //实际宽高
        int src_w = bitmap.getWidth();
        int src_h = bitmap.getHeight();

        int dst_w = src_w;
        int dst_h = src_h;

        //限定宽高
        int maxWidth = 1900;
        int maxHeight = 1000;

        //宽高缩放比例
        float scale_w = ((float) dst_w) / src_w;
        float scale_h = ((float) dst_h) / src_h;

        Matrix matrix = new Matrix();
        matrix.postScale(scale_w, scale_h);
        Bitmap dstbmp = Bitmap.createBitmap(bitmap, 0, 0, src_w, src_h, matrix,true);

        //质量压缩
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        dstbmp.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] bytes = baos.toByteArray();*

思路:

图片的宽高缩放是使用createBitmap(),所以需要将图片转成bitmap,并获取满足设定宽高的宽高比。

函数:

public static String getImageBase64(String path) {
        //decode to bitmap
        Bitmap bitmap = BitmapFactory.decodeFile(path);

        //将图片的宽高限定在1920x1080,
        //实际宽高
        int src_w = bitmap.getWidth();
        int src_h = bitmap.getHeight();

        int dst_w = src_w;
        int dst_h = src_h;

        //限定宽高
        int maxWidth = 1900;
        int maxHeight = 1000;

        //等比例缩放
        if (dst_w > maxWidth) {
            float scale = (float) (maxWidth) / (float) (dst_w);
            dst_w = maxWidth;
            dst_h = (int) (dst_h * scale);
        }
        if (dst_h > maxHeight) {
            double scale = (float) (maxHeight) /(float) ( dst_h);
            dst_h = maxHeight;
            dst_w = (int) (dst_w * scale);
        }


        float scale_w = ((float) dst_w) / src_w;
        float scale_h = ((float) dst_h) / src_h;

        Matrix matrix = new Matrix();
        matrix.postScale(scale_w, scale_h);
        Bitmap dstbmp = Bitmap.createBitmap(bitmap, 0, 0, src_w, src_h, matrix,true);

        //convert to byte array
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        dstbmp.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] bytes = baos.toByteArray();

        //base64 encode
        byte[] encode = Base64.encode(bytes, Base64.DEFAULT);
        String encodeString = new String(encode);
        return encodeString;
    }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值