首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MediaStore获取正常大小

从MediaStore获取正常大小
EN

Stack Overflow用户
提问于 2014-06-11 00:16:44
回答 1查看 213关注 0票数 0

我使用这段代码,MediaStore返回给我一个小尺寸的bitmapimage

如何使用mediastore获得正常大小的照片?

有人能帮我解决这个问题吗?需要一些帮助来解决这个问题。需要正常大小的照片。

代码语言:javascript
复制
public class ActivityPhoto extends Activity implements OnClickListener{

    File directory;
    final int TYPE_PHOTO = 1;
    final int REQUEST_CODE_PHOTO = 1;

    ImageView imageViewPhoto;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.schedule_of_subject_photo);

        createDirectory();
        imageViewPhoto = (ImageView) findViewById(R.id.imageViewPhoto);
    }

    public void onClickPhoto(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        intent.putExtra(MediaStore.EXTRA_OUTPUT, generateFileUri(TYPE_PHOTO));
        startActivityForResult(intent, REQUEST_CODE_PHOTO);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
        if (requestCode == REQUEST_CODE_PHOTO) {
            if (resultCode == RESULT_OK) {
                if (intent == null) {
                    Log.d(TAG, "Intent is null");
                } else {
                    Log.d(TAG, "Photo uri: " + intent.getData());
                    Bundle bndl = intent.getExtras();
                    if (bndl != null) {
                        Object obj = intent.getExtras().get("data");
                        if (obj instanceof Bitmap) {
                            Bitmap bitmap = (Bitmap) obj;
                            Log.d(TAG, "bitmap " + bitmap.getWidth() + " x " + bitmap.getHeight());
                            imageViewPhoto.setImageBitmap(bitmap);
                        }
                    }
                }
            } else if (resultCode == RESULT_CANCELED) {
                Log.d(TAG, "Canceled");
            }
        }  
    }

    private Uri generateFileUri(int type) {
        File file = null;
        switch (type) {
        case TYPE_PHOTO:
            file = new File(directory.getPath() + "/" + "photo_"
                    + System.currentTimeMillis() + ".jpg");
            break;
        }
        Log.d(TAG, "fileName = " + file);
        return Uri.fromFile(file);
    }

    private void createDirectory() {
        directory = new File(
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyFolder");
        if (!directory.exists())
            directory.mkdirs();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2014-06-16 18:53:10

看起来没有办法从MediaStore那里得到它。

正如MediaStore.ACTION_IMAGE_CAPTURE的文档所说:

调用方可以传递一个额外的EXTRA_OUTPUT来控制写入此图像的位置。如果EXTRA_OUTPUT不存在,则在额外字段中以位图对象的形式返回一个小尺寸的图像。这对于只需要一个小图像的应用程序很有用。如果存在EXTRA_OUTPUT,则完整大小的图像将写入EXTRA_OUTPUT的Uri值。

因此,接收较小的图像(或者在我的测试设备上根本没有图像)是预期的行为。我认为你需要自己解码图像才能得到原始尺寸。如下所示:

代码语言:javascript
复制
public class MyActivity extends Activity {

    private static final String TAG = "MyActivity";
    File directory;
    final int TYPE_PHOTO = 1;
    final int REQUEST_CODE_PHOTO = 1;

    ImageView imageViewPhoto;
    private Uri mFileUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_main);

        createDirectory();
        imageViewPhoto = (ImageView) findViewById(R.id.imageViewPhoto);
    }

    @Override
    public boolean onCreateOptionsMenu(final Menu menu) {
        getMenuInflater().inflate(R.menu.action_bar, menu);
        return true;
    }

    public void onClickPhoto(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        mFileUri = generateFileUri(TYPE_PHOTO);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri);
        startActivityForResult(intent, REQUEST_CODE_PHOTO);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent intent) {
        if (requestCode == REQUEST_CODE_PHOTO) {
            if (resultCode == RESULT_OK) {
                imageViewPhoto.setImageURI(mFileUri);

                new SetPictureTask(getApplicationContext(), mFileUri, imageViewPhoto).execute();
            } else if (resultCode == RESULT_CANCELED) {
                Log.d(TAG, "Canceled");
            }
        }
    }

    private Uri generateFileUri(int type) {
        File file = null;
        switch (type) {
            case TYPE_PHOTO:
                file = new File(directory.getPath() + "/" + "photo_"
                        + System.currentTimeMillis() + ".jpg");
                break;
        }
        Log.d(TAG, "fileName = " + file);
        return Uri.fromFile(file);
    }

    private void createDirectory() {
        directory = new File(
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyFolder");
        if (!directory.exists())
            directory.mkdirs();
    }

    private static class SetPictureTask extends AsyncTask<Void, Void, Void> {
        private final ImageView mImageView;
        private final Uri mFileUri;
        private final Context mContext;

        private Bitmap mBitmap;
        private int mWidth;
        private int mHeight;

        public SetPictureTask(final Context context, final Uri fileUri, final ImageView imageViewPhoto) {
            mImageView = imageViewPhoto;
            mFileUri = fileUri;
            mContext = context;
        }

        @Override
        protected Void doInBackground(final Void... params) {
            BitmapFactory.Options opts = new BitmapFactory.Options();

            opts.inJustDecodeBounds = true;

            BitmapFactory.decodeFile(mFileUri.getPath(), opts);

            mWidth = opts.outWidth;
            mHeight = opts.outHeight;

            // required width for image in order to decode faster and consume less memory
            final int scaleFactor = Math.min(mWidth / mImageView.getWidth(), mHeight / mImageView.getHeight());

            opts.inJustDecodeBounds = false;
            opts.inSampleSize = scaleFactor;
            opts.inPurgeable = true;

            mBitmap = BitmapFactory.decodeFile(mFileUri.getPath(), opts);

            return null;
        }

        @Override
        protected void onPostExecute(final Void aVoid) {
            mImageView.setImageBitmap(mBitmap);

            Toast.makeText(mContext, "Bitmap dimensions are (" + mWidth + " x " + mHeight + ")", Toast.LENGTH_LONG).show();
        }
    }
}

请注意,增加了获取维度和解码BitmapAsyncTask

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24145986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档