我正在开发一个媒体播放器应用程序,并希望加载专辑封面艺术图像以在ListView中显示.现在,它可以正常使用我从last.fm自动下载的图像,这些图像低于500×500 png.但是,我最近添加了另一个面板到我的应用程序,允许查看全屏艺术作品,所以我用大(1024×1024)png替换了我的一些艺术作品.
现在当我用高分辨率艺术品滚动几张专辑时,我的BitmapFactory上出现了一个java.lang.OutOfMemoryError.
static public Bitmap getAlbumArtFromCache(String artist, String album, Context c)
{
Bitmap artwork = null;
File dirfile = new File(SourceListOperations.getAlbumArtPath(c));
dirfile.mkdirs();
String artfilepath = SourceListOperations.getAlbumArtPath(c) + File.separator + SourceListOperations.makeFilename(artist) + "_" + SourceListOperations.makeFilename(album) + ".png";
File infile = new File(artfilepath);
try
{
artwork = BitmapFactory.decodeFile(infile.getAbsolutePath());
}catch(Exception e){}
if(artwork == null)
{
try
{
artwork = BitmapFactory.decodeResource(c.getResources(), R.drawable.icon);
}catch(Exception ex){}
}
return artwork;
}
有什么我可以添加来限制生成的Bitmap对象的大小,如256×256?这就是缩略图所需要的更大,我可以创建一个重复的函数或参数来获取完整大小的艺术作品以显示全屏.
此外,我在ImageViews上显示这些位图,这些位图很小,大约在150×150到200×200之间.较小的图像缩小比大图像缩小.有没有办法应用缩小滤波器来平滑图像(可能是抗锯齿)?如果我不需要,我不想缓存一堆额外的缩略图文件,因为它会使管理图片图像变得更加困难(目前你可以在目录中转储新的缩略图文件,它们将在下次自动使用他们得到了装载).
完整的代码是在http://github.org/CalcProgrammer1/CalcTunes,在src / com / calcprogrammer1 / calctunes / AlbumArtManager.java中,尽管在另一个函数中没有太大的不同(如果图像丢失,则返回到检查last.fm).
最佳答案 我使用这个私有函数来设置我想要的缩略图大小:
//decodes image and scales it to reduce memory consumption
public static Bitmap getScaledBitmap(String path, int newSize) {
File image = new File(path);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inInputShareable = true;
options.inPurgeable = true;
BitmapFactory.decodeFile(image.getPath(), options);
if ((options.outWidth == -1) || (options.outHeight == -1))
return null;
int originalSize = (options.outHeight > options.outWidth) ? options.outHeight
: options.outWidth;
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = originalSize / newSize;
Bitmap scaledBitmap = BitmapFactory.decodeFile(image.getPath(), opts);
return scaledBitmap;
}