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

时间:2014-03-25 11:47:18

标签: android android-bitmap

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

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

6 个答案:

答案 0 :(得分:17)

我遇到了同样的问题,并提出了针对此问题的单线解决方案here

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

答案 1 :(得分:8)

我刚刚创建了一个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");
        }

答案 2 :(得分:4)

谷歌提供了如何做到这一点的培训。从Displaying Bitmaps Efficiently

下载示例

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

答案 3 :(得分:3)

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

        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);

答案 4 :(得分:1)

您不需要加载整个图片,因为它太大而且您的手机可能无法显示完整的位图像素。 您需要先根据设备屏幕大小进行缩放。 这是我发现的最好的方法,它的效果非常好: Android: Resize a large bitmap file to scaled output file

答案 5 :(得分:1)

我找到了一种方法,而不使用任何外部库

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);
    }
}

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

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

<强>参考文献:

Android Universal Image Loader