Bitmapfactory示例

nel*_*kie 4 android

我想创建一个动态图像视图,其中我的图库中的每个图像将使用bitmapfactory而不是图像视图中绑定的图像drawable.是否有一些网站有这方面的bitmapfactory教程?我相信使用bitmapfactory使用较少的内存将图像绑定到图像视图中?这是正确的吗?我还希望尽量减少内存泄漏的风险,这就是我想使用bitmapfactory的原因.请帮忙.我找不到教会bitmapfactory的基本例子.

K_A*_*nas 19

构建位图对象

1)从文件

使用adb工具和push选项将test2.png复制到SD卡上

这是从SD卡加载位图的最简单方法.只需将图像的路径传递给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);
    }
}
Run Code Online (Sandbox Code Playgroud)

所有这些代码都是加载我们之前复制到sdcard的image 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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码使用基本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);
}
Run Code Online (Sandbox Code Playgroud)

  • @nelzkie 参考这个 StackOverflow 线程 http://stackoverflow.com/questions/477572/android-strange-out-of-memory-issue-while-loading-an-image-to-a-bitmap-object/823966#823966而这个用于 insamplesize http://developer.android.com/training/displaying-bitmaps/load-bitmap.html (2认同)