位图工厂示例

4

我想创建一个动态图像视图,我的相册中的每个图像都将使用bitmapfactory而不是绑定在图像视图中的图像可绘制。是否有一些网站可以提供有关此的bitmapfactory教程? 我相信使用bitmapfactory使用的内存比将图像绑定到图像视图中要少。这是正确的吗? 我还想尽量减少内存泄漏的风险,所以我想使用bitmapfactory。 请帮忙。 我找不到教授bitmapfactory的基本示例。

1个回答

20

构建位图对象

1) 从文件中获取

使用带有push选项的adb工具将test2.png复制到sdcard上。

这是从sdcard加载位图最简单的方法。只需将图像的路径传递给BitmapFactory.decodeFile(),然后让Android SDK完成剩下的工作即可。

public class TestImages extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView image = (ImageView) findViewById(R.id.test_image);
        Bitmap bMap = BitmapFactory.decodeFile("/sdcard/test2.png");
        image.setImageBitmap(bMap);
    }
}

这段代码的作用仅是加载我们之前复制到SD卡中的图像test2.png。BitmapFactory使用这个图像创建了一个位图对象,然后我们使用ImageView.setImageBitmap()方法更新ImageView组件。

2) 从输入流获取

使用BitmapFactory.decodeStream()将BufferedInputStream转换为位图对象。

public class TestImages extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView image = (ImageView) findViewById(R.id.test_image);
        FileInputStream in;
        BufferedInputStream buf;
        try {
            in = new FileInputStream("/sdcard/test2.png");
            buf = new BufferedInputStream(in);
            Bitmap bMap = BitmapFactory.decodeStream(buf);
            image.setImageBitmap(bMap);
            if (in != null) {
            in.close();
            }
            if (buf != null) {
            buf.close();
            }
        } catch (Exception e) {
            Log.e("Error reading file", e.toString());
        }
    }
}

这段代码使用基本的Java FileInputStream和BufferedInputStream创建BitmapFactory.decodeStream()的输入流。文件访问代码应该包含在try/catch块中,以捕获FileInputStream或BufferedInputStream抛出的任何异常。另外,在处理完流句柄后,应该关闭它们。

3) 从Android项目资源中获取

使用BitmapFactory.decodeResource(res, id)从Android资源获取位图。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ImageView image = (ImageView) findViewById(R.id.test_image);
    Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
    image.setImageBitmap(bMap);
}

顺便问一下,你知道如何使用位图回收吗?我认为它可以减少内存使用,如果我没记错的话。谢谢。 - nelzkie
@nelzkie 是的,回收位图将告诉垃圾回收器可以释放与该位图相关联的对象。 - K_Anas
如果您想加载大位图,回收将没有效果,而是需要使用inSampleSize以有效的方式加载位图。 - K_Anas
2
@nelzkie 可以参考这个 StackOverflow 的帖子 https://dev59.com/puo6XIcBkEYKwwoYTzNK#823966 以及这个关于 insamplesize 的链接 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html - K_Anas
@nelzkie 对于recycle(),只需在确保不再需要该bitmapObj时使用bitmapObj.recycle()。如果这是您要寻找的内容,请接受此答案。 - K_Anas

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