Android BitmapFactory.decodeStream问题
我正在创建一个应用程序,使用几乎150个图像帧进行逐帧动画。通过使用处理程序更改图像视图的背景图像来播放动画。在处理程序中,我从/mnt/sdcard/Android/data/ApplicationPackage文件夹中检索图像,并通过以下方式将其动态更改为图像视图背景: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));
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毫秒,并且动画效果平滑