14600


下記のソースで画像を読み込んで表示していたのですが、一部の大きなサイズの画像が読み込めません。  
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]


CC BY-SA 3.0
2015-08-18T01:10:09.527
14550
2015-08-18T15:32:27.427
525
question
android
画像読み込み時に Bitmap too large to be uploaded into a texture というエラー


その画像の大きさはどのぐらいでしょうか？すべての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>


CC BY-SA 3.0
2015-08-18T03:52:22.010
14562
2015-08-18T10:47:24.540
2017-05-23T12:38:55.307
-1
10899
14550
answer


読み込めるサイズの取得方法は既にsm4さんが書かれているようなので、「サイズを落して読み込んでくれる関数」のほうだけ。。

サイズを落としつつ読み込むにはBitmapFactory.Optionsの.inSampleSizeを設定し、BitmapFactory.decodeFileの第二引数に設定します。私がよくやるのは以下のようなコードです。

[code]

    BitmapFactory.Options bmp_options = new BitmapFactory.Options();
    bmp_options.inSampleSize = 何分の一にするか指定;
    imgView.setImageBitmap(BitmapFactory.decodeFile(picturePath,bmp_options));
    
[/code]


CC BY-SA 3.0
2015-08-18T08:38:15.353
14579
2015-08-18T08:42:56.807
2015-08-18T08:42:56.807
49
8795
14550
answer


ハードウェアレンダリングに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)


CC BY-SA 3.0
2015-08-18T15:32:27.427
14600
2015-08-18T15:32:27.427
2017-05-23T12:38:55.250
-1
5337
14550
answer