如何将位图压缩为较小尺寸的图像(保持纵横比)

时间:2016-03-28 16:53:01

标签: java android bitmap

我只是想压缩一个位图,这样我就可以获得一个低尺寸的图像。 像2mb图像到-100kb,但保持图像的宽高比。

我已经尝试了一些在线代码,但是在某些时候,我甚至无法在压缩后获得更大的图像尺寸。 那我怎么能这样做?  但无论如何我在网上找到了这个代码:

private Bitmap getBitmap(int path, Canvas canvas) {

    Resources resource = null;
    try {
        final int IMAGE_MAX_SIZE = 1200000; // 1.2MP
        resource = getResources();

        // Decode image size
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(resource, path, options);

        int scale = 1;
        while ((options.outWidth * options.outHeight) * (1 / Math.pow(scale, 2)) >
                IMAGE_MAX_SIZE) {
            scale++;
        }
        Log.d("TAG", "scale = " + scale + ", orig-width: " + options.outWidth + ", orig-height: " + options.outHeight);

        Bitmap pic = null;
        if (scale > 1) {
            scale--;
            // scale to max possible inSampleSize that still yields an image
            // larger than target
            options = new BitmapFactory.Options();
            options.inSampleSize = scale;
            pic = BitmapFactory.decodeResource(resource, path, options);

            // resize to desired dimensions
            int height = canvas.getHeight();
            int width = canvas.getWidth();
            Log.d("TAG", "1th scale operation dimenions - width: " + width + ", height: " + height);

            double y = Math.sqrt(IMAGE_MAX_SIZE
                    / (((double) width) / height));
            double x = (y / height) * width;

            Bitmap scaledBitmap = Bitmap.createScaledBitmap(pic, (int) x, (int) y, true);
            pic.recycle();
            pic = scaledBitmap;

            System.gc();
        } else {
            pic = BitmapFactory.decodeResource(resource, path);
        }

        Log.d("TAG", "bitmap size - width: " +pic.getWidth() + ", height: " + pic.getHeight());
        return pic;
    } catch (Exception e) {
        Log.e("TAG", e.getMessage(),e);
        return null;
    }
}

我有图像路径,但我不知道什么是画布(第二个参数)。 还有一种更好的方法来压缩位图吗?   谢谢

1 个答案:

答案 0 :(得分:0)

您可能需要查看此Android Developers帖子。此外,要从路径使用BitmapFactory.decodeFile()

解码位图