画像読み込み時に Bitmap too large to be uploaded into a texture というエラー


下記のソースで画像を読み込んで表示していたのですが、一部の大きなサイズの画像が読み込めません。  
Bitmap too large to be uploaded into a texture
と言われているのでサイズオーバーだと思うのですが、その端末で撮った画像を読み込むだけでサイズオーバーになるのは何故でしょうか。  
また、適宜読み込めるサイズに落して読み込んでくれる関数はないでしょうか。

[code]

        public void setImage(){
            Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i, REQUEST_PICK_CONTENT );
        }
    
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            imgView = (ImageView)findViewById(R.id.backgroundImageView);
            if (requestCode ==REQUEST_PICK_CONTENT  && resultCode == RESULT_OK && null != data) {
                Uri selectedImage = data.getData();
                String[] filePathColumn = { MediaStore.Images.Media.DATA };
                Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String picturePath = cursor.getString(columnIndex);
                cursor.close();
                imgView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
            }
        }
    
[/code]




ハードウェアレンダリングにOpenGLを利用しているため、OpenGL由来のテクスチャサイズの制約があります。この限界は端末によってまちまちで、Android2.X時代の化石も含めるのであれば、512x512が確実に使えるラインです。

Androidがハードウェアレンダリングをサポートしたのは3.0からですが、デフォルトとなったのは4.0からです。Android4.0でハードウェアレンダリングをサポートする端末は「2048×2048以上のテクスチャを扱えること」が
**must** となっているようで、このサイズを超えると端末依存となり問題が生じやすいです。

画像を縮小する場合、[ThumbnailUtils](http://developer.android.com/intl/ja/reference/android/media/ThumbnailUtils.html)を使うのが便利です。また、`View#setLayerType()`で`View.LAYER_TYPE_SOFTWARE`を指定しソフトウェアレンダリングに切り替えれば解決することもあります。

* * *

**参考**

  * [HW accelerated activity - how to get OpenGL texture size limit?](https://stackoverflow.com/questions/7428996/hw-accelerated-activity-how-to-get-opengl-texture-size-limit)




その画像の大きさはどのぐらいでしょうか？すべてのAndroidスマートフォンには画像の大きさの制限があり、`GL_MAX_TEXTURE_SIZE`という定数で一辺の上限値を確認できます。古いスマートフォンではこの値は2048×2048になっていましたが、最近では異なることが多いです。下記のソースで`GL_MAX_TEXTURE_SIZE`を確認できます。

[code]

    int[] maxTextureSize = new int[1];
    gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
    Log.i("glinfo", "Max texture size = " + maxTextureSize[0]);
    
[/code]

* * *

英語での説明：  
* <https://stackoverflow.com/q/16931295/1667977>  
* <https://stackoverflow.com/q/4527695/1667977>

