如何加载原始图片

问题描述:

虽然我需要加载的原始图片,只有一条错误消息:如何加载原始图片

位图太大,无法上传到纹理(5312x2988,最大= 4096×4096)

有谁知道如何解决这个问题?

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

究竟为什么你需要加载一个完整的5312x2988的图像?你使用的是什么神奇的Android设备,实际上提供了很多像素? –

+0

因为我用相机拍照,这是图片大小。 – user3818495

+0

我可以问问题吗?因为我尝试添加“\t thumbBitmap = BitmapFactory.decodeFile(sourceId);”,但仍无法加载任何图片。有任何条件导致这个问题? – user3818495

您应该将其缩放到最大或更小。

您可以使用此代码

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

和规模得到位图的最大尺寸与

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

我可以问一下问题:什么是g1?怎么办有g1? – user3818495

+0

@ user3818495,它不是g1,它是gl(OpenGL)。请阅读http://developer.android.com/guide/topics/graphics/opengl.html,以及http://developer.android.com/reference/android/opengl/GLES10.html。 – Ufkoku

你可以看看Picasso。这是一个非常有用的库加载图像

例子:

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

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