解决:Bitmap too large to be uploaded into a texture exception

本文探讨了Android中因硬件加速导致的大尺寸图片加载失败的问题,并提供了两种解决方案:一是禁用硬件加速;二是采用类似Google Maps的方式,通过BitmapRegionDecoder分块加载图片,确保即使是非常大的图片也能正常显示。

简单说就是硬件加速的时候,对图片的大小有限制。不同设备可能有不同的最大值。这个问题悲催的地方是,程序貌似没有捕获到这个exception, 结果是程序也不报错,图片也显示不出来。只有看debug log才能发现这个error message.

一个解决的方法是禁止硬件加速,简单粗暴:有关

《Android中的硬件加速》请看这篇文章!

<application android:hardwareAccelerated="false" ...>

比较好的解决方法是类似google map的实现:将图片分成不同的块,每次加载需要的块。android提供了一个方法:

http://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html

1 public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)
2  
3 public Bitmap decodeRegion (Rect rect, BitmapFactory.Options options)

采取上述操作后,就可以加载很多图片,同时也可以显示超级大图了。


提供的引用中未提及在Android Studio中解决“Canvas trying to draw too large bitmap”问题的解决方案,不过可以根据一般的经验给出一些常见的解决办法。 ### 缩放位图 在将位图绘制到Canvas之前,将其缩放到合适的大小。可以使用`BitmapFactory.Options`来进行缩放。 ```java BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; // 设置采样率,这里设置为2表示缩小为原来的1/2 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.large_image, options); ``` ### 分块绘制 如果位图过大无法一次性绘制,可以将其分成多个小块,然后逐块绘制到Canvas上。 ```java int blockWidth = 100; int blockHeight = 100; for (int x = 0; x < bitmap.getWidth(); x += blockWidth) { for (int y = 0; y < bitmap.getHeight(); y += blockHeight) { int width = Math.min(blockWidth, bitmap.getWidth() - x); int height = Math.min(blockHeight, bitmap.getHeight() - y); Bitmap block = Bitmap.createBitmap(bitmap, x, y, width, height); canvas.drawBitmap(block, x, y, null); } } ``` ### 释放不再使用的资源 及时释放不再使用的位图资源,避免内存占用过高。 ```java if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); bitmap = null; } ``` ### 检查设备内存状态 在绘制之前检查设备的内存状态,如果内存不足,可以采取相应的措施,如减少绘制的内容或提示用户清理内存。 ```java ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); if (memoryInfo.lowMemory) { // 内存不足,采取相应措施 } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值