将图像压缩到指定大小的最快方法是什么?

时间:2018-04-25 07:54:17

标签: android image-compression

在我的项目中,我有时需要将一些图像(1-10)上传到服务器。尺寸从1M到10M不等。在上传之前,应压缩每个图像,直到大小<512KB。我像这样压缩:

public static byte[] compressImageA(Bitmap image, int maxSize) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int options = 100;
    image.compress(Bitmap.CompressFormat.JPEG, options, baos);
    while (baos.size() / 1024 > maxSize) {
        baos.reset();
        options -= 10;
        image.compress(Bitmap.CompressFormat.JPEG, options, baos);
    }
    if (image != null && !image.isRecycled()) {
        try {
            image.recycle();
        } catch (Exception e) {
        }
    }
    return baos.toByteArray();
}

这种方法可以实现,但速度不够快。例如,压缩10张图片大约需要25秒。(每张图片的大小在1M到10M之间)。经过一些测试,我发现Bitmap.compress()可能在压缩过程中被多次调用并占用最多时间。那么我能做些什么才能让它更快?我想在每次压缩期间只调用Bitmap.compress()一次。或者还有其他方法可以更快地将图像压缩到指定的大小吗?

2 个答案:

答案 0 :(得分:0)

您可以使用此方法从实际尺寸缩小尺寸

/**
     * reduces the size of the image
     *
     * @param image  uncompressed image
     * @param reduce how much to reduce
     * @return new bitmap
     */
    public static Bitmap reduceBitmap(Bitmap image, int reduce) {
        int width = image.getWidth();
        int height = image.getHeight();

        float bitmapRatio = (float) width / (float) height;
        if (bitmapRatio > 1) {
            width -= reduce;
            height = (int) (width / bitmapRatio);
        } else {
            height -= reduce;
            width = (int) (height * bitmapRatio);
        }
        if (width > 0 && height > 0)
            return Bitmap.createScaledBitmap(image, width, height, true);
        else
            return image;
    }

或者您可以根据需要使用以下代码,我将其用于 PNG 您可以查看其他

Bitmap actualImage=BitmapFactory.decodeStream(getAssets().open("imagg1.png"));
ByteArrayOutputStream out = new ByteArrayOutputStream();
actualImage.compress(Bitmap.CompressFormat.PNG, 100, out);
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));

答案 1 :(得分:0)

你的算法速度和它一样快。

时间开始在盒子外思考。 25秒内的10张图像意味着1张图像需要2.5秒。你想要多快?幸运的是,该算法很容易并行化。所以你可以在n台计算机上分割任务。