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



我只是想压缩一个位图,这样我就可以得到一个小尺寸的图像。像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;
    }
}

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

您可能想查看这篇Android开发者的帖子。此外,要从路径解码位图,请使用BitmapFactory.decodeFile()

最新更新