Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android BitmapFactory.decodeStream问题_Android_Android Animation_Bitmapfactory - Fatal编程技术网

Android BitmapFactory.decodeStream问题

Android BitmapFactory.decodeStream问题,android,android-animation,bitmapfactory,Android,Android Animation,Bitmapfactory,我正在创建一个应用程序,使用几乎150个图像帧进行逐帧动画。通过使用处理程序更改图像视图的背景图像来播放动画。在处理程序中,我从/mnt/sdcard/Android/data/ApplicationPackage文件夹中检索图像,并通过以下方式将其动态更改为图像视图背景: FileInputStream in; in = new FileInputStream(mFrames.get(imgpos));

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

FileInputStream in;                       
in = new FileInputStream(mFrames.get(imgpos));                              
bitmap  = BitmapFactory.decodeStream(in); 
if (in != null)
{   
    in.close();
}
这会在解码文件输入流时产生一些问题,因为某些图像创建位图需要花费大量时间。对于每个图像,图像文件大小几乎小于40KB,但对于相同大小的文件,从外部目录解码图像需要不同的时间。我尝试过采样文件大小和加载,但它直接影响图像清晰度。有谁能告诉我,从外部文件夹将图像加载到位图的更好方法是什么,并且所有图像的持续时间都相同


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

在为图像创建位图之前,可以缩小图像的比例

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


希望这有帮助

由于图像的压缩大小不是很大,也许您可以将它们作为字节数组预加载到内存中进行解码?您可以创建一个Hashmap并将解码后的位图保存到Hashmap中,然后启动动画。这不是一个好方法,但这将提高动画的性能。谢谢,但我尝试在线程启动之前将图像加载到ArrayList中,并导致VM立即超出异常。这意味着您的位图总大小对于设备内存来说可能太大。试试这个办法。位图的确切像素大小是多少?每帧图像大小约为35-40 KB,图像的尺寸为480 x 800:O:O这太大了!您是否意识到它相当于164Mo的原始数据?假设您有RGB8图像,您的35-40ko大小是不相关的,因为它是压缩文件的大小…光盘上图像的总大小约为6.8 MB。谢谢,我会检查它:不客气!我传递给decodeSampledBitmapFromPath函数的路径是我存储在sd卡中的图像的路径。因此,您可能需要相应地修改它。此外,整个过程是使用AsyncTask完成的,因此UI永远不会挂起。图像视图大小为480 x 800,图像大小也相同。因此,样本量始终仅为1。这没什么区别。另外,我的问题就是解码流。对于Galaxy S,加载单个图像大约需要30到450毫秒,而在Galaxy S2中,加载时间总是小于20毫秒,并且动画效果平滑