Bitmap too large to be uploaded into a texture 解决方案

今天用ImageView加载图片时,图片并不能显示,logcat中打印出了 Bitmap too large to be uploaded into a texture (4160x3120, max=4096x4096)的错误提示。
在网上搜索了一番,因为当开启硬件加速的时候,GPU对于openglRender 有一个限制,这个不同的手机会有不同的限制:

这个限制值可以通过canvas.getMaximumBitmapHeight()和canvas.getMaximumBitmapWidth()来获得。

网上一个简单粗暴的方法是关闭硬件加速:

<application
 android:hardwareAccelerated="false" >

这样的确解决了图片,但你会在app运行的时候,发现app变得十分卡顿。

果断抛弃了这个方法,百度了好久也没找到个像样的解决方案,大多都是东抄西抄,放弃了百度。


认真看看提示,是Bitmap too large 。我突然想起很早很早之前看过郭神的一篇关于加载大图OOM的问题的一篇博客。

我们只要通过BitmapFactory.Options对象对图片进行压缩就好了。废话不多说,我直接在ImageUtil类中写下了图片压缩的方法。


public static int calculateInSampleSize(BitmapFactory.Options options,
                                            int reqWidth, int reqHeight) {
        // 源图片的高度和宽度
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            // 计算出实际宽高和目标宽高的比率
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
            // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
            // 一定都会大于等于目标的宽和高。
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        return inSampleSize;
    }

    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
                                                         int reqWidth, int reqHeight) {
        // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);
        // 调用上面定义的方法计算inSampleSize值
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        // 使用获取到的inSampleSize值再次解析图片
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);
    }

    public static Bitmap decodeSampledBitmapFromFilePath(String imagePath,
                                                         int reqWidth, int reqHeight) {
        // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(imagePath, options);
        // 调用上面定义的方法计算inSampleSize值
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        // 使用获取到的inSampleSize值再次解析图片
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(imagePath,options);
    }

 然后在需要的地方调用就好了,上面的代码也是直接参考郭神的博客中的代码的,注释已经很清楚了。

最后在需要的地方调用我们的方法:

imageView.setImageBitmap(ImageUtil.decodeSampledBitmapFromFilePath(imagePath,100,100));

通过图片压缩,我们的图片能够被正常的显示了。


希望通过这篇文章,能够帮助遇到Bitmap too large to be uploaded into a texture深陷百度不能自拔的小伙伴能够快速解决。


资料参考:

郭霖  :Android高效加载大图、多图解决方案,有效避免程序OOM   

http://blog.csdn.net/sinyu890807/article/details/9316683

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个异常通常是由于插入的图片格式不被Excel支持而引起的。在Excel中,只支持插入BMP、JPG、PNG、GIF等格式的图片,如果插入的图片格式不是这些格式,就会出现这个异常。 如果出现这个异常,你可以尝试使用Pillow库将图片转换为BMP、JPG、PNG、GIF等格式,然后再插入到Excel中。 下面是一个将图片转换为BMP格式并插入到Excel中的示例代码: ```python import xlwt import os from PIL import Image # 创建一个Workbook对象,用于保存Excel文件 workbook = xlwt.Workbook() # 创建一个Worksheet对象,用于保存Excel文件中的一个工作表 worksheet = workbook.add_sheet('Sheet1') # 打开图片文件 image_file = 'example.jpg' with Image.open(image_file) as img: # 将图片转换为BMP格式 bmp_file = 'example.bmp' img.convert('RGB').save(bmp_file) # 将BMP图片插入到Excel中 worksheet.insert_bitmap(bmp_file, 0, 0) # 保存Excel文件 workbook.save('example.xls') # 删除临时生成的BMP图片文件 os.remove(bmp_file) ``` 在代码中,我们首先使用Pillow库打开图片文件,然后将图片转换为BMP格式,并将BMP图片插入到Excel中。最后,保存Excel文件并删除临时生成的BMP图片文件。 如果你想要插入JPG、PNG、GIF等格式的图片,只需要将图片转换为对应的格式即可。例如,将图片转换为JPG格式的代码如下: ```python img.convert('RGB').save(jpg_file, 'JPEG') ``` 这里的`jpg_file`是你要保存的JPG文件名。保存JPG文件时,需要指定`format`参数为`JPEG`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值