2015-07-21 1 views
1

Bien que je dois charger une image d'origine, ont seulement un message d'erreur:Comment charger une image originale

Bitmap trop volumineux pour être téléchargés dans une texture (5312x2988, max = 4096x4096)

Est-ce que quelqu'un sait comment résoudre ce problème?

public class MainActivity extends ListActivity { 

    //define source of MediaStore.Images.Media, internal or external storage 

    final Uri sourceUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
    final Uri thumbUri = MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI; 

    final String thumb_DATA = MediaStore.Images.Thumbnails.DATA; 
    final String source_DATA = MediaStore.Images.Media.DATA; 

    final String thumb_IMAGE_ID = MediaStore.Images.Thumbnails.IMAGE_ID; 
    final String sourceId = MediaStore.Images.Media._ID; 
    //SimpleCursorAdapter mySimpleCursorAdapter; 
    MyAdapter mySimpleCursorAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.activity_main); 

     String[] from = {MediaStore.MediaColumns.TITLE}; 
     int[] to = {android.R.id.text1}; 

     CursorLoader cursorLoader = new CursorLoader(
      this, 
      sourceUri, 
      null, 
      null, 
      null, 
      MediaStore.Audio.Media.TITLE); 

     Cursor cursor = cursorLoader.loadInBackground(); 

     mySimpleCursorAdapter = new MyAdapter(
      this, 
      android.R.layout.simple_list_item_1, 
      cursor, 
      from, 
      to, 
      CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 

     setListAdapter(mySimpleCursorAdapter); 

     getListView().setOnItemClickListener(myOnItemClickListener); 
    } 

    OnItemClickListener myOnItemClickListener 
     = new OnItemClickListener(){ 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
      Cursor cursor = mySimpleCursorAdapter.getCursor(); 
      cursor.moveToPosition(position); 

      int int_ID = cursor.getInt(cursor.getColumnIndex(MediaStore.Images.Media._ID)); 
      getThumbnail(int_ID); 
     }}; 

    private Bitmap getThumbnail(int id){ 

     String[] thumbColumns = {source_DATA, sourceId}; 

     CursorLoader thumbCursorLoader = new CursorLoader(
      this, 
      sourceUri, 
      thumbColumns, 
      sourceId + "=" + id, 
      null, 
      null); 

     Cursor thumbCursor = thumbCursorLoader.loadInBackground(); 

     Bitmap thumbBitmap = null; 
     if(thumbCursor.moveToFirst()){ 
      int thCulumnIndex = thumbCursor.getColumnIndex(thumb_DATA); 

      String thumbPath = thumbCursor.getString(thCulumnIndex); 

      Toast.makeText(getApplicationContext(), 
       thumbPath, 
       Toast.LENGTH_LONG).show(); 

      thumbBitmap = BitmapFactory.decodeFile(thumbPath); 

      //Create a Dialog to display the thumbnail 
      AlertDialog.Builder thumbDialog = new AlertDialog.Builder(MainActivity.this); 

      ImageView thumbView = new ImageView(MainActivity.this); 

      thumbView.setImageBitmap(thumbBitmap); 
      LinearLayout layout = new LinearLayout(MainActivity.this); 
      layout.setOrientation(LinearLayout.VERTICAL); 
      layout.addView(thumbView); 
      thumbDialog.setView(layout); 
      thumbDialog.show(); 
     } else { 
      Toast.makeText(getApplicationContext(), 
       "NO Thumbnail!", 
       Toast.LENGTH_LONG).show(); 
     } 

     return thumbBitmap; 
    } 

    public class MyAdapter extends SimpleCursorAdapter{ 

     Cursor myCursor; 
     Context myContext; 

     public MyAdapter(Context context, int layout, Cursor c, String[] from, 
      int[] to, int flags) { 
      super(context, layout, c, from, to, flags); 

      myCursor = c; 
      myContext = context; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View row = convertView; 
      if(row==null){ 
       LayoutInflater inflater=getLayoutInflater(); 
       row=inflater.inflate(R.layout.row, parent, false); 
      } 

      ImageView thumbV = (ImageView)row.findViewById(R.id.thumb); 
      TextView textV = (TextView)row.findViewById(R.id.text); 

      myCursor.moveToPosition(position); 

      int myID = myCursor.getInt(myCursor.getColumnIndex(MediaStore.Images.Media._ID)); 
      String myData = myCursor.getString(myCursor.getColumnIndex(MediaStore.Images.Media.DATA)); 
      textV.setText(myData); 

      String[] thumbColumns = {thumb_DATA, thumb_IMAGE_ID, }; 
      CursorLoader thumbCursorLoader = new CursorLoader(
       myContext, 
       thumbUri, 
       thumbColumns, 
       thumb_IMAGE_ID + "=" + myID, 
       null, 
       null); 
      Cursor thumbCursor = thumbCursorLoader.loadInBackground(); 

      Bitmap myBitmap = null; 
      if(thumbCursor.moveToFirst()){ 
       int thCulumnIndex = thumbCursor.getColumnIndex(source_DATA); 
       String thumbPath = thumbCursor.getString(thCulumnIndex); 
       myBitmap = BitmapFactory.decodeFile(thumbPath); 
       thumbV.setImageBitmap(myBitmap); 
      } 

      return row; 
     } 
    } 
} 
+0

Pourquoi diable avez-vous besoin de charger une image 5312x2988 complète? Quel appareil Android magique utilisez-vous qui offre réellement autant de pixels? –

+0

Parce que j'utilise l'appareil photo prendre une photo, c'est la taille de l'image. – user3818495

+0

Puis-je poser une question? Parce que j'essaie d'ajouter "\t thumbBitmap = BitmapFactory.decodeFile (sourceId);", mais ne peut toujours pas charger une image. Est-ce que n'importe quelle condition cause ce problème ??? – user3818495

Répondre

0

Vous devez l'échelle à la taille maximale ou inférieure.

Vous pouvez obtenir la taille max avec ce code

int[] maxSize = new int[1]; gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0);

Et bitmap à grande échelle avec

Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) 
+0

Puis-je poser une question: qu'est-ce que g1? comment faire g1? – user3818495

+0

@ user3818495, ce n'est pas g1, c'est gl (OpenGL). Lisez à ce sujet ici http://developer.android.com/guide/topics/graphics/opengl.html, et ici http://developer.android.com/reference/android/opengl/GLES10.html. – Ufkoku

2

Vous pouvez jeter un oeil Picasso. Ceci est une bibliothèque très utile pour charger des images

Exemple:

Uri uri = Uri.fromFile(YOUR FILE)); 

Picasso.with(activity).load(uri) 
      .resize(96, 96).centerCrop().into(viewHolder.image);