【问题标题】:How to load an original picture如何加载原始图片
【发布时间】:2015-07-21 14:56:37
【问题描述】:

虽然我需要加载一张原图,但只有一个错误信息:

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

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

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

【问题讨论】:

  • 为什么需要加载完整的 5312x2988 图像?您使用的是什么神奇的 Android 设备,它实际上提供了这么多像素?
  • 因为我用相机拍照,所以这是图片尺寸。
  • 我可以问问题吗?因为我尝试添加“ thumbBitmap = BitmapFactory.decodeFile(sourceId); ”,但仍然无法加载任何图片。有什么条件导致这个问题???
  • 你让它工作了吗?
  • 是的!它可以工作,但仍然无法加载图片,我想可能是图像尺寸太大。我仍然尝试使用“Uri uri = Uri.fromFile(YOUR FILE));”但也有一些错误。

标签: android eclipse


【解决方案1】:

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

例子:

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

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

【讨论】:

    【解决方案2】:

    您应该将其缩放到最大尺寸或更低。

    您可以使用此代码获得最大尺寸

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

    并使用缩放位图

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多