减少位图大小

时间:2015-08-09 13:35:50

标签: android bitmap

我有这台机器,我必须捕获产品的图像并填写其他数据,将它们上传到服务器。我一直在使用图像捕捉意图,但系统正在缩小图像尺寸为150 * 200,但多亏了你现在我有了全尺寸图像。 问题是图像的大小是一个大的(2-5mbs)我尝试了缩小位图方法和毕加索库但图像文件仍然具有相同的大小。你可以给我一些关于如何减小它的尺寸的指导(如有必要,甚至是解决方案)。 我尝试了什么:

public void grabImage(ImageView imageView) {
    this.getContentResolver().notifyChange(mImageUri, null);
    ContentResolver cr = this.getContentResolver();
    Bitmap bitmap;
    try
    {
        bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, mImageUri);

        //ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        Bitmap bm = ShrinkBitmap(fullpath, bitmap.getWidth(), bitmap.getHeight());
        imageView.setImageBitmap(bm);
    }
    catch (Exception e)
    {
        Log.d("This", "Failed to load", e);
    }
}

Bitmap ShrinkBitmap(String file, int width, int height){

    BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
    bmpFactoryOptions.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);

    int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height);
    int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width);

    if (heightRatio > 1 || widthRatio > 1)
    {
        if (heightRatio > widthRatio)
        {
            bmpFactoryOptions.inSampleSize = 4;
        } else {
            bmpFactoryOptions.inSampleSize = 4;
        }
    }

    bmpFactoryOptions.inJustDecodeBounds = false;
    bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);
    return bitmap;
}

的问候,

2 个答案:

答案 0 :(得分:0)

试试这个;

if (heightRatio > 1 || widthRatio > 1)
{
if (heightRatio > widthRatio)
{
bmpFactoryOptions.inSampleSize *=2;
}
else {
bmpFactoryOptions.inSampleSize = 4;
}
}

答案 1 :(得分:0)

以下网站非常清楚如何以有效的方式加载图像。这意味着在加载图片时已经按照最高功率2(2,4,8,...)进行缩放,以便加载的图片仍然大于您需要的尺寸。这样你只需加载你真正需要的东西并减少使用内存。

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

(我看到你在代码中使用了这个过程的一些元素,但对我来说没什么意义)

在第二步中,您可以进一步将图片缩小到您需要的实际宽度+高度,这可以通过以下方式完成:   Bitmap.createScaledBitmap(bitmap_large,(int)width,(int)height,false);