如何解决Bitmap OutOfMemory如何解决?

本文介绍了一种改进的Bitmap处理方法,旨在减少内存使用并解决BitmapOutOfMemory问题,特别针对不同分辨率的图像更新场景。

看了些许文章,有很多都是用到了BitmapFactory.Options,设置里面的一些参数来实现图片的压缩

现在有一个更好的方法来解决Bitmap OutOfMemory的问题,例

比如你的原始bitmap只有176*144,但是画面更新却要352*288,那么每次你都要通过BitmapFactory来进行拉伸。

Matrix matrix = new Matrix(); float Scale_Width =352; float Scale_Height = 288; matrix.postScale(Scale_Width, Scale_Height); Bitmap temp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);



然后只要拉伸的过程中,程序就会多分配一块内存来存储拉伸的图像.

那么就极有可能会出现VMbort OutOfMemory,那么怎么解决了,如果想把176*144的图像换成352*288的图像,那么你应该这样做:

Rect rect = new Rect (0,0,176,144); RectF rectf = new RectF(0,0,352,288); canvas.drawBitmap(bitmap_176,rect,rectf,null);

这样就解决了OOM的问题,不会产生新的内存.

C#中出现Out of memory错误可能由多种原因导致,以下是不同场景下的原因及解决办法: ### Yolov4 - C# 界面运行时 - **原因**:在进行Yolov4 - C#界面运行时,出现CUDA error: out of memory和CPU error: out of Ram,显存爆炸。经排查,问题出在Yolo底层darknet_cuda.c中创建矩阵的函数里的CHECK_CUDA函数 [^1]。 - **解决办法**:在C#调用Yolo的检测器之前,使用Yolo的Dispose函数抛出所有显存占用,即`YoloWrapper.YoloWrapper.DisposeYolo();` [^1]。 ### 数组内存使用方面 - **原因**:当使用如`int[] array = new int[1000000];`这样的大数组时,程序员难以手动释放其内存空间,可能导致应用程序运行越来越慢,最终出现内存不足错误 [^3]。 - **解决办法**:可以考虑优化数据结构和算法,避免一次性创建过大的数组。例如,采用分块处理的方式,减少内存的一次性占用。 ### 图形处理方面 #### System.Drawing相关操作 - **原因**:在进行图形绘制等操作时,如`System.Drawing.Graphics.DrawImage`等方法调用,可能由于内存管理不当,出现`System.OutOfMemoryException: Out of memory`错误 [^4]。 - **解决办法**:确保在使用完图形对象后及时调用`Dispose`方法释放资源。例如: ```csharp using System.Drawing; // 创建图形对象 using (Graphics g = Graphics.FromImage(someImage)) { // 进行图形绘制操作 g.DrawImage(anotherImage, 0, 0); } // 离开using块时,g对象会自动调用Dispose方法释放资源 ``` #### Bitmap.Clone方法裁剪图片 - **原因**:在使用`Bitmap.Clone`方法裁剪图片时,对于竖直图片裁剪失败并出现Out of memory错误。可能是由于图片数据在内存中的存储方式、裁剪区域大小等因素导致内存分配不足 [^5]。 - **解决办法**:可以尝试分块裁剪图片,避免一次性处理过大的图片数据。同时,确保在使用完图片对象后及时释放资源: ```csharp public void cutPicture(String picPath, string newPath, int x, int y, int width, int height) { try { // 图片路径 String oldPath = picPath; // 定义截取矩形 System.Drawing.Rectangle cropArea = new System.Drawing.Rectangle(x, y, width, height); // 要截取的区域大小 // 加载图片 using (System.Drawing.Image img = System.Drawing.Image.FromStream(new System.IO.MemoryStream(System.IO.File.ReadAllBytes(oldPath)))) { // 定义Bitmap对象 using (System.Drawing.Bitmap bmpImage = new System.Drawing.Bitmap(img)) { // 进行裁剪 using (System.Drawing.Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat)) { // 保存成新文件 bmpCrop.Save(newPath); } } } } catch (OutOfMemoryException ex) { // 处理内存不足异常 Console.WriteLine("内存不足:" + ex.Message); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值