我用 ffmpeg 开发了一个应用程序来解码媒体帧。我用解码结果填充了 Bitmap 对象,并使用 ImageView.setImageBitmap 来显示位图。 在 Android 2.3 中它运行良好,但在 Android 4.0 或更高版本中它不起作用。 代码很简单:
imgVedio.setImageBitmap(bitmapCache);//FIXME:in 4.0 it displays nothing
然后我尝试将位图写入文件并重新加载文件以显示。
String fileName = "/mnt/sdcard/myImage/video.jpg";
FileOutputStream b = null;
try
{
b = new FileOutputStream(fileName);
bitmapCache.compress(Bitmap.CompressFormat.JPEG, 100, b);// write data to file
}
catch (FileNotFoundException e)
{
e.printStackTrace();
} finally
{
try
{
if(b != null)
{
b.flush();
b.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
Bitmap bitmap = BitmapFactory.decodeFile(fileName);
imgVedio.setImageBitmap(bitmap);
可以用,但是性能太差。 那么有人可以帮我解决这个问题吗?
我认为这是内存不足的问题,您可以使用此方法修复它:
private Bitmap loadImage(String imgPath) {
BitmapFactory.Options options;
try {
options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(imgPath, options);
return bitmap;
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
“inSampleSize”选项将返回较小的图像并节省内存。你可以在 ImageView.setImageBitmap 中调用它:
imgVedio.setImageBitmap(loadImage(IMAGE_PATH));
这是一种根据目标宽度和高度(来自文档)计算样本大小值的方法,该值是 2 的幂:
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) >= reqHeight
&& (halfWidth / inSampleSize) >= reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}