Bitmap too large to be uploaded into a texture (1284x5582, max=4096x4096)

解决Android大图加载失败的问题

项目中加载一个尺寸1284x5582的一张大图,使用加载图片的是Picasso.由于图片太大,控件无法显示.

查看log发现出现:Bitmap too large to be uploaded into a texture (1284x5582, max=4096x4096);

经过查找资料是因为当开启硬件加速的时候,GPU对于openglRender 有一个限制,这个不同的手机会有不同的限制。简单说就是硬件加速的时候,对图片的大小有限制。不同设备可能有不同的最大值。这个问题悲催的地方是,程序貌似没有捕获到这个exception, 结果是程序也不报错,图片也显示不出来。

解决办法:在清单文件Manifest里面的application标签下添加 android:hardwareAccelerated="false"  

作用是禁止硬件加速
————————————————
版权声明:本文为优快云博主「Tager丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u011622280/article/details/77447276

注:也可以只在某个activity指定

<activity
    android:name=".TestActivity"
    android:screenOrientation="portrait"
    android:hardwareAccelerated="false"/>
提供的引用中未提及在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) { // 内存不足,采取相应措施 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值