2014-10-27 78 views
1

我用下面的代码检索图像文件中的Android的位图文件的大小要大得多:位图的大小比它的加载

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
Bitmap bitmap = BitmapFactory.decodeFile(path, options); 

然而,位图的大小比两倍多文件大小。例如,对于大小为520kb的文件,位图大小大约为1.3MB。有没有一种方法可以得到与文件大小相同的位图?

回答

3

位图大小是没有压缩的纯内存数据。您可以使用每个像素4个字节来计算大小(使用您的设置)。

你的文件可能是像JPG格式的压缩格式。如果没有压缩,它会占用相同的空间。

位图保存在内存中的原因基本上是性能。您可以以非压缩的方式更快地读取数据并使用它。例如,如果您想查看特定像素的颜色,您需要先解压缩数据。这需要时间,检查的像素越多,花费的时间就越多。

从存储中读取文件时,与完整的读取过程相比,解压仅需要一段可以忽略的时间。因此与“按需”解压缩相比,您不会有太大的性能影响。

+0

我怎么能拉起从文件中位图压缩格式? – Prateek 2014-10-27 10:21:59

+0

根据您的其他评论:您无法以压缩格式读取该文件,并将其设置为ImageView以查看该文件。你需要像你已经做的那样解压缩它。没有其他方式可以显示它。你可以读取文件本身,但它只是一些二进制数据,你不能用作位图。 – WarrenFaith 2014-10-27 10:24:46

+0

那么有没有一种方法可以减小位图的大小?我的目的不仅仅是在视图中显示它。 – Prateek 2014-10-28 10:11:46

0

尝试这样可以帮助你,

public static Bitmap decodeFile(File f,int WIDTH,int HIGHT){ 
try { 
    //Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

    //The new size we want to scale to 
    final int REQUIRED_WIDTH=WIDTH; 
    final int REQUIRED_HIGHT=HIGHT; 
    //Find the correct scale value. It should be the power of 2. 
    int scale=1; 
    while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT) 
     scale*=2; 

    //Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize=scale; 
    return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
} catch (FileNotFoundException e) {} 
return null; 
} 
+0

这并没有回答基本问题:为什么存储器中的位图大小比内存大。你也没有解释你的代码做什么以及为什么应该尝试。 – WarrenFaith 2014-10-27 10:23:24

+0

它不回答这个问题。此外,我不想增加或减少图像的大小。我对图像有不同的用途,只是在imageView上显示它。因此,我希望位图与其在文件中的位置相同。 – Prateek 2014-10-27 10:24:58

相关问题