防止位图太大而无法上传到纹理android

我需要以图库forms全屏显示原始图像。 对于拇指,它将完美地工作,当我尝试使用原始源以全屏显示该图像时,它将无法显示。 在大多数情况下,如果图像分辨率大于2000,那么它将显示错误位图太大而无法上传到纹理android

我想阻止这一点,我搜索谷歌但没有得到任何答案。

我遇到了同样的问题,并为此问题提出了一个单线程解决方案:

Picasso.with(context).load(new File(path/to/File)).fit().centerCrop().into(imageView); 

我刚刚创建了一个if else函数来检查图像是否大于1M像素这里是示例代码:

 public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); selectedImagePath = getPath(selectedImageUri); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; Bitmap bitmap = BitmapFactory.decodeFile(selectedImagePath); int height = bitmap.getHeight(), width = bitmap.getWidth(); if (height > 1280 && width > 960){ Bitmap imgbitmap = BitmapFactory.decodeFile(selectedImagePath, options); imageView.setImageBitmap(imgbitmap); System.out.println("Need to resize"); }else { imageView.setImageBitmap(bitmap); System.out.println("WORKS"); } 

谷歌提供了如何做到这一点的培训。 从高效显示位图下载示例

看看ImageResizer类。 ImageResizer.decodeSampledBitmapFrom *使用此方法获取缩小图像。

您不需要加载整个图像,因为它太大,可能您的手机无法显示完整的位图像素。 您需要先根据设备屏幕大小进行缩放。 这是我find的最好的方法,它的效果非常好: Android:将大型位图文件的大小调整为缩放的输出文件

我find了一种不使用任何外部库的方法

 if (bitmap.getHeight() > GL10.GL_MAX_TEXTURE_SIZE) { // this is the case when the bitmap fails to load float aspect_ratio = ((float)bitmap.getHeight())/((float)bitmap.getWidth()); Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, (int) ((GL10.GL_MAX_TEXTURE_SIZE*0.9)*aspect_ratio), (int) (GL10.GL_MAX_TEXTURE_SIZE*0.9)); imageView.setImageBitmap(scaledBitmap); } else{ // for bitmaps with dimensions that lie within the limits, load the image normally if (Build.VERSION.SDK_INT >= 16) { BitmapDrawable ob = new BitmapDrawable(getResources(), bitmap); imageView.setBackground(ob); } else { imageView.setImageBitmap(bitmap); } } 

基本上,最大图像尺寸是系统强加的限制。 上述方法将正确调整超出此限制的位图。 但是,只会加载整个图像的一部分。 要更改显示的区域,可以更改createBitmap()方法的xy参数。

此方法处理任何大小的位图,包括使用专业相机拍摄的照片。

参考文献:

Android通用图像加载器

这是我用来纠正在4096×4096分辨率的图像视图中拟合尺寸为3120×4196分辨率的图像的问题的代码。 这里ImageViewId是在主布局中创建的图像视图的id,ImageFileLocation是要resize的图像的路径。

  ImageView imageView=(ImageView)findViewById(R.id.ImageViewId); Bitmap d=BitmapFactory.decodeFile(ImageFileLcation); int newHeight = (int) ( d.getHeight() * (512.0 / d.getWidth()) ); Bitmap putImage = Bitmap.createScaledBitmap(d, 512, newHeight, true); imageView.setImageBitmap(putImage);