安卓里一个很好用的图片压缩方法

先说使用方法
根据图片的大小来定图片的压缩比例,然后下面代码中的90越小,图片清晰度越小,相应图片大小也越小
if ((!filepath.equals(“”)) && (Util.getImageSize(filepath) != 0.0)) {
new Thread(new Runnable() {

            @Override
            public void run() {
                Bitmap b = null;
                try {
                    Log.d("wly",
                            " 图片大小压缩前的 = " + Util.getImageSize(filepath));

                    int a = (int) Math.sqrt(Util.getImageSize(filepath) / 50);

if (a <= 1) {
b = Util.getCompressBitmapFromOrigalPath(filepath,
false, a);
} else {
b = Util.getCompressBitmapFromOrigalPath(filepath,
true, a);
}
Log.d(“wly”,
” a = ” + a + “=====Util.getImageSize(filepath)==” + Util.getImageSize(filepath)
+ “=======” + Math.sqrt(Util.getImageSize(filepath) / 50));

                    mZoomImgPath = Util.saveThumbNailPic(b, filepath);
                    Log.d("wly",
                            " 图片大小压缩后的 = " + Util.getImageSize(mZoomImgPath));
                } catch (Exception exception) {
                    exception.printStackTrace();
                } finally {
                    if (b != null && !b.isRecycled()) {
                        b.recycle();
                    }
                }
                mHandler.sendEmptyMessage(3);
            }
        }).start();
    } else {
        showToast(PostCardActivity.this, "请选择图片~");
    }

压缩图片的方法代码

/**
* 压缩图片
*
* @param path
* @param isScale
* @return
*/
public static Bitmap getCompressBitmapFromOrigalPath(String path,
boolean isScale, int scale) {
try {
BitmapFactory.Options options = new BitmapFactory.Options();
int degree = getBitmapDegree(path);
Bitmap retatedBitmap = null;
if (!isScale) {
return null;
} else {
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
Bitmap bitmapCompress = BitmapFactory.decodeFile(path, options);
if (degree != 0) {
retatedBitmap = rotateBitmapByDegree(bitmapCompress, degree);
} else {
retatedBitmap = bitmapCompress;
}
}

        return retatedBitmap;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 读取图片的旋转的角度
 *
 * @param path 图片绝对路径
 * @return 图片的旋转角度
 */
private static int getBitmapDegree(String path) {
    int degree = 0;
    try {
        // 从指定路径下读取图片,并获取其EXIF信息
        ExifInterface exifInterface = new ExifInterface(path);
        // 获取图片的旋转信息
        int orientation = exifInterface.getAttributeInt(
                ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);
        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                degree = 90;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                degree = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                degree = 270;
                break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return degree;
}

/**
 * 将图片按照某个角度进行旋转
 *
 * @param bm     需要旋转的图片
 * @param degree 旋转角度
 * @return 旋转后的图片
 */
private static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
    Bitmap returnBm = null;

    // 根据旋转角度,生成旋转矩阵
    Matrix matrix = new Matrix();
    matrix.postRotate(degree);
    try {
        // 将原始图片按照旋转矩阵进行旋转,并得到新的图片
        returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
                bm.getHeight(), matrix, true);
    } catch (OutOfMemoryError e) {
    }
    if (returnBm == null) {
        returnBm = bm;
    }
    if (bm != returnBm) {
        bm.recycle();
    }
    return returnBm;
}

/**
 * Bitmap对象保存为图片文件; p 为原来路径如果不压缩返回原路径
 */
public static String saveThumbNailPic(Bitmap bitmap, String p) {
    String thumbPathDir = Environment.getExternalStorageDirectory()
            .getAbsolutePath() + "/smsmms/";// 存放压缩的目录
    File file = new File(thumbPathDir, "zoom.jpg");
    if (file.exists()) {
        file.delete();
    }
    if (bitmap == null) {
        // copyFile(p, file.getAbsolutePath());
        // return file.getAbsolutePath();
        return p;
    }
    BufferedOutputStream bos = null;
    try {
        File folder = new File(thumbPathDir);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        if (!file.exists()) {
            Log.d("dqvv", "Create the file:" + file.getPath());
            file.createNewFile();
        }
        bos = new BufferedOutputStream(new FileOutputStream(file));
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bos);
        bos.flush();
        Log.d("dqvv", "this compress file compressed success ");
    } catch (IOException e) {
        e.printStackTrace();
        Log.d("dqvv", "this compress file compressed fail ");
    } finally {
        if (bos != null) {
            try {
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    return file.getAbsolutePath();
}

public static double getImageSize(String path) {
    if (TextUtils.isEmpty(path)) {
        return 0;
    }
    File f = new File(path);
    Log.d("dqvv", "getImageSize " + f.canRead() + "," + f.canWrite());
    if (f.exists()) {
        long size = f.length();
        long size_k = size / 1024;
        double mb = size_k * 1.0 / 1024;
        Log.d("wly", " mb " + mb + "MB");
        if (mb > 1) {
            BigDecimal b = new BigDecimal(mb);
            double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP)
                    .doubleValue();
            return f1 * 1024;
            // return f1 + "MB";
        } else
            return size_k;
        // return size_k + "KB";
    }
    return 0;
    // return 0 + "KB";
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ,java代码 Here's a simple example of compressing an image in Android using Java: ``` private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 90; while (baos.toByteArray().length / 1024 > 100) { baos.reset(); image.compress(Bitmap.CompressFormat.JPEG, options, baos); options -= 10; } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); return bitmap; } ``` This code takes a `Bitmap` object as input and returns a compressed version of it. The compression is done using the `JPEG` format and the quality is reduced in steps of 10 until the size of the image is less than 100 KB. The compressed image is then returned as a `Bitmap` object. ### 回答2: 在Android中,可以使用Bitmap类提供的方法来实现图片压缩。下面是一个简单的图片压缩方法的代码示例: ```java public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 90; // 初始化压缩比例 while (baos.toByteArray().length / 1024 > 300) { // 判断图片大小是否大于300KB baos.reset(); // 重置baos image.compress(Bitmap.CompressFormat.JPEG, options, baos); options -= 10; // 每次压缩减少10 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); return bitmap; } ``` 在该方法中,首先将原始图片通过ByteArrayOutputStream转换为字节数组,然后将压缩比例初始化为100。通过循环,判断压缩后的图片大小是否大于300KB,如果是,则将压缩比例递减10,循环重新压缩,直到图片大小小于等于300KB。 最后,通过ByteArrayInputStream将压缩后的字节数组转换为Bitmap对象,并返回该对象作为压缩后的图片。 要使用该方法,可以将原始图片Bitmap对象作为参数传入,然后获取返回的压缩后的Bitmap对象,这样就实现了图片压缩。 ### 回答3: 图片压缩Android开发中是一个常见的需求,下面我给出一个简单的图片压缩代码示例: ```java public Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; while (baos.toByteArray().length / 1024 > 100) { // 若图片大于100kb,则继续压缩 baos.reset(); image.compress(Bitmap.CompressFormat.JPEG, options, baos); options -= 10; } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); return bitmap; } ``` 上面的代码使用了质量压缩方法,首先将原始图片通过输出流(ByteArrayOutputStream)转为字节数组,然后进行循环压缩,每次压缩质量减少10%,直到图片大小小于等于100KB,最后将压缩后的字节数组解码为Bitmap对象返回。 使用这段代码的示例: ```java // 压缩图片 Bitmap originalBitmap = BitmapFactory.decodeFile("/sdcard/myImage.jpg"); Bitmap compressedBitmap = compressImage(originalBitmap); // 显示压缩后的图片 ImageView imageView = findViewById(R.id.imageView); imageView.setImageBitmap(compressedBitmap); ``` 以上代码仅提供了简单的图片压缩方法,实际应用中还可以结合其他压缩方法,如尺寸压缩、采样率压缩等,以更好地满足实际需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值