当前位置: 首页 > 知识库问答 >
问题:

从Textureview中保存多个位图图像时,应用程序堆大小迅速增长

裴昕
2023-03-14

我正在制作android应用程序,我试图从textureview拍摄的位图图像生成视频。在这里,我可以从TextureView中获得位图图像,并将其保存在内部存储中,以便以后生成视频。但问题是,随着位图图像被创建并保存在本地存储中,应用程序的堆大小也在迅速增长,在将大约800个图像保存为.png文件后,它给出了OutOfMemory异常,将目标GC堆从258MB钳位到256MB。那么,如何避免堆增长呢?

Bitmap bitmap = textureView.getBitmap(TF_OD_API_INPUT_SIZE, TF_OD_API_INPUT_SIZE);
if(croppedBitmap!=null){
            croppedBitmap=null;
 }

 croppedBitmap = Bitmap.createBitmap((int) canvasWidth, (int) canvasHeight, Bitmap.Config.ARGB_8888);
@Override
                public void onSurfaceTextureUpdated(SurfaceTexture texture) {


                    if(Utils.isVideoRecordingStarted(activity)){
//if it already has bitmap recycle it to create room
                        if(mToVideo!=null){
                            mToVideo.recycle();
                            mToVideo=null;
                        }

                        if(newImage!=null){
                            newImage.recycle();
                            newImage=null;
                        }

//hold bitmap image
                        mToVideo = textureView.getBitmap(VideoManagerConfig.VIDEO_WIDTH,VideoManagerConfig.VIDEO_HEIGHT);

                        if(mToVideo!=null) {
                            if(activity.getResources().getConfiguration().orientation!=ORIENTATION_PORTRAIT){

                                mToVideo = textureView.getBitmap(VideoManagerConfig.VIDEO_HEIGHT,VideoManagerConfig.VIDEO_WIDTH);

                                if(mToVideo!=null){
                                    newImage = Utils.RotateBitmap(mToVideo.copy(mToVideo.getConfig(),true),90);
                                    Log.i(ObjectDetectionCameraImpl.TAG,"W: "+newImage.getWidth()+", H: "+newImage.getHeight());
                                    SaveToLocalStorage(newImage);
                                }
                            }else {
                                SaveToLocalStorage(mToVideo.copy(mToVideo.getConfig(),true));
                            }

                            mToVideo=null;
                        }
                    }else if(isInitilizedVideo && !Utils.isVideoRecordingStarted(activity)){
                        //video stopped and has something to encode
                        imageFromTextureListener.getBuffer(getBufferMetaData());
                    }
                }
            };

VideoManager:images_924.png//表示已有925张图像保存在本地,索引从0开始

缓冲区:925/1800//此处1800=>将保存的图像总数

Following the link to log file:  

https://drive.google.com/open?id=1GxFV-h2V68FSoWRs9K1AYhZChnlTFFqq

共有1个答案

朱高丽
2023-03-14

在尝试缩放图像时发生的类似问题(但在java中)在这里得到了如下回答:除非发生垃圾收集,否则JVM(android使用ART)会在需要时不断扩展堆,一直扩展到给定的完整堆大小。简言之,

Java进程可以自由地使用您给它的所有内存。

 类似资料:
  • 问题内容: 在Django中上传图片后,如何轻松调整其大小?我正在使用Django 1.0.2,并且已经安装了PIL。 我当时正在考虑重写Model的save()方法以调整其大小,但是我真的不知道如何开始并覆盖它。 有人可以指出我正确的方向吗?谢谢 :-) @GuðmundurH:这将不起作用,因为django-stdimage软件包在Windows上不起作用 问题答案: 在这种方法中,你可以将块

  • 我想在我的Android应用程序中增加位图的大小。 基本上,我想创建一个新的位图,其宽度与原始位图相同,但高度更大。(新)额外像素的背景可以是黑色、白色或透明。 我该怎么做?

  • 我正在使用一个库从url获取图像并将其作为位图图像保存到缓存中。但是当我检索该图像时,它非常小。如何根据手机屏幕增加位图图像的高度和宽度?这是创建位图的类。

  • 谁能指导我怎么做这件事吗? 我是一个新的android所以请,如果我能有一个详细的程序,我会很感激。

  • 结果在性能较慢的情况下,有一种更快的方法来获得位图。使用NDK是否更好? 查找实际示例