将图像资源作为RGB 565格式加载

7
我试图降低我的应用程序的内存使用量,我注意到大部分内存使用都是由活动背景引起的:在XHDPI中,每个720*1280*4像素的背景需要3.6兆字节,Android似乎并不会在它们不再使用时立即释放它们。
有没有办法告诉Android在加载某些资源图像时使用RGB 565而不是RGB 8888,以便在那些没有alpha通道的较大图像上节省一些内存?
我知道这可以通过编程实现,但我想知道是否也可以在活动布局中使用的图像和背景或setBackgroundResource()函数中实现。
2个回答

10

你可以这样做:

protected void onCreate(Bundle savedInstanceState)
{
    setContentView(R.layout.high_scores);
    BitmapFactory.Options opts = new BitmapFactory.Options();
    opts.inPreferredConfig = Config.RGB_565;
    BitmapDrawable highScoresBg = BitmapFactory.decodeResource(getResources(), R.drawable.achievements, opts);
    findViewById(R.id.high_scores_root).setBackgroundDrawable(highScoresBg);

当使用ARGB_8888时,您图像的像素将存储在2个字节中,而不是4个字节。这可以节省50%的内存,但质量会相应降低。

这篇文章告诉我们,在Android < 2.3上,默认情况下图像为RGB_565。但是,如果图像有Alpha通道(例如PNG),它将以ARGB_8888格式加载。在Android> = 2.3上,默认情况下所有图像都以ARGB_8888格式加载。


4
好的,我会尽力进行翻译。需要翻译的内容是:"Yes, as I said I know it can be done this way, but I'm looking for a way to tell Android to directly load specific layout images in RGB565 so I don't have to do it for each programmatically." - Jukurrpa

2

目前还没有一种方法可以将资源标记为RGB_565。

最好的办法是提供一个后续的数据文件,将您的图像文件映射到所需的内存格式。在加载时,您可以检查每个资源ID是否与文件匹配,以确定是否要将BitmapFactory选项设置为565或8888。

大多数拉取图像数据的应用程序都使用类似的过程。例如,一些具有小分辨率的JPG图像被认为是缩略图,并使用565路径加载到内存中。全屏JPG则允许作为8888加载到内存中。

基本上,您的应用程序始终需要一定程度的逻辑来相应地设置BitmapOptions。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接