在android中使用图像的有效方法(`Drawable`of`bitmap`)

在android中使用图像的有效方法(`Drawable`of`bitmap`),android,image,Android,Image,形象总是给我制造麻烦:(。 java.lang.OutOfMemoryError:位图大小超过VM预算-即使我使用非常小的图像,android也是主要问题。 请给我推荐一些使用图像的技巧。(链接、教程、示例项目等) 我的一些爱好是 我应该选择哪个Drawable还是bitmap BitmapFactory.decodeFile或Drawable.createFromPath BitmapFactory.decodeStream或Drawable.createFromStream 如何在旋转时保持

形象总是给我制造麻烦:(。
java.lang.OutOfMemoryError:位图大小超过VM预算-即使我使用非常小的图像,android也是主要问题。
请给我推荐一些使用图像的技巧。(链接、教程、示例项目等)

我的一些爱好是

  • 我应该选择哪个
    Drawable
    还是
    bitmap
  • BitmapFactory.decodeFile
    Drawable.createFromPath
  • BitmapFactory.decodeStream
    Drawable.createFromStream
  • 如何在旋转时保持
    可绘制
    位图
  • 保存或通过intent传递
    Drawable
    Bitmap
    是个好主意吗

  • 这完全取决于您对图像的具体操作。bitmapfactory用于创建位图。当您要绘制某些内容时,可绘制对象也会使用:)

    在内存中创建位图后,您希望如何处理它

    至于旋转,您应该注意onRestoreInstanceState和onSaveInstanceState。大概是这样的:

    private static final String PHOTO_TAKEN = "photo_taken";
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState.getBoolean(PHOTO_TAKEN)) {
            // do something if you have your pic here
        }
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(PHOTO_TAKEN, mPhotoTaken); // saving the state of the image (if the photo is taken or not in this case)
    }
    
    至于通过额外的。。。我打赌这是个坏主意,因为你已经摆脱了记忆异常。。。。您可以传递对该图像的引用,如路径ID或其他内容

    更新:
    在其中一个项目中,我试图在ImageView控件中显示从cam拍摄的图像,但我的活动中出现了outofmemory异常。原因是它把整个大形象都记在了记忆里。解决方法非常简单:我减小了图像大小:

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 4;
    
        Bitmap bitmap = BitmapFactory.decodeFile(mImagePath, options);
    

    为了避免内存不足错误,我们可以使用BitMapRegionCoder(对大于最大纹理限制2048x2048的原始图像进行解码),也可以通过指定原始位图的坐标对其进行解码。(例如每个季度的坐标)

    已经有很多帖子了。是的,有很多。我找了很多。但是我没有得到正确的答案。至少我的问题是我应该使用
    Drawable
    还是
    Bitmap
    我使用了你的更新,最终还是会出现内存泄漏。如果你只做了一次,你不会注意到,但更多的处理,它会被注意到。