BitmapFactory.decodeStream问题

时间:2012-08-27 10:18:03

标签: android android-animation bitmapfactory

我正在创建一个使用近150个图像帧的逐帧动画应用程序。通过使用Handler更改图像视图的背景图像来播放动画。在处理程序内部,我从文件夹/ mnt / sdcard / Android / data / ApplicationPackage中检索图像,并通过以下方式动态更改为图像视图背景:

FileInputStream in;                       
in = new FileInputStream(mFrames.get(imgpos));                              
bitmap  = BitmapFactory.decodeStream(in); 
if (in != null)
{   
    in.close();
}

这会在解码文件输入流时产生一些问题,因为某些图像需要花费大量时间来创建位图。每个图像的图像文件大小几乎都小于40 KB,但是对于相同大小的文件,从外部目录解码图像需要不同的持续时间。我试图对文件大小和负载进行采样,但它直接影响图像的清晰度。任何人都可以建议我将图像加载到外部文件夹中的位图以及所有图像的持续时间相同的更好方法是什么?

谢谢,蒂姆

2 个答案:

答案 0 :(得分:0)

我认为你必须在显示位图之前预加载位图...使用位图数组和后台任务,在输入活动时加载所有图像。 绝对不允许您的处理程序执行耗时的任务,例如加载位图!

答案 1 :(得分:0)

您可以在为图像创建位图之前缩小图像尺寸。

public Bitmap decodeSampledBitmapFromPath(String path) 
{
    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, requiredWidth, requiredHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    Bitmap newBmap = BitmapFactory.decodeFile(path, options);

    return newBmap;
}

public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) 
{
    int inSampleSize = 1;

    if (imageHeight > reqHeight || imageWidth > reqWidth) 
    {
        if (imageWidth > imageHeight) 
        {
            inSampleSize = Math.round((float)imageHeight / (float)reqHeight);
        } 
        else 
        {
            inSampleSize = Math.round((float)imageWidth / (float)reqWidth);
        }
    }
    return inSampleSize;
}

如果图像比加载它们的视图大很多,那么这种向下缩放确实有助于更快地创建位图。此外,缩放Bitmap比直接创建位图所占用的内存要少得多 设置为inJustDecodeBounds时,BitmapFactory.Options中的true可让您在为Bitmap创建Bitmap之前获得高度和宽度。因此,您可以检查图像是否大于所需的图像。如果是,则将它们缩放到所需的高度和宽度,然后创建其{{1}}。

希望这有帮助!