android位图质量低下的问题 [英] android-bitmap low quality issue

查看:47
本文介绍了android位图质量低下的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚创建了一些功能,可以从相机拍摄照片并将结果图像放入图像视图.我发现我拍摄的照片质量太差了.

I just created some functions to take picture from camera and put the result image into the imageview. And what i found is that my taken picture quality is so bad.

以下是一些代码:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
            Bitmap photo = (Bitmap) data.getExtras().get("data");
            picture.setImageBitmap(photo);
        }
    }

View.OnClickListener camerabtnlistener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_REQUEST);
        }
    };


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_help_3);
        btnPicture = (Button) findViewById(R.id.btnPicture);
        picture= (ImageView) findViewById(R.id.picture);
        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        layoutPic = (RelativeLayout) findViewById(R.id.layoutPic);
        setSupportActionBar(mToolbar);

        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

        btnPicture.setOnClickListener(camerabtnlistener);

    }

和xml

<ImageView
            android:id="@+id/picture"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/test_admin_big"
            android:adjustViewBounds="true"/>

我已经在下面尝试了这些解决方案,但这不起作用

i already tried these solution below, but that's not working

  1. 调整ImageView的大小以适合纵横比
  2. 适合图像插入ImageView,保持宽高比,然后将ImageView调整为图像尺寸?
  3. Android位图质量问题
  1. Resizing ImageView to fit to aspect ratio
  2. Fit image into ImageView, keep aspect ratio and then resize ImageView to image dimensions?
  3. Android bitmap quality issues

请告知

谢谢

推荐答案

如果您使用Bundle extras = data.getExtras();在您的onActivityResult中,它将返回缩略图而不是实际图像.

If you use Bundle extras = data.getExtras(); in your onActivityResult then it will return thumbnail image not actual image.

这是我用于捕获和保存摄像机图像,然后将其显示到imageview的代码.

Here is code I have used for Capturing and Saving Camera Image then display it to imageview.

您必须将相机图像保存到特定位置,然后从该位置获取.

You have to save Camera image to specific location then fetch from that location.

这是打开捕获摄像机图像活动的方法.

Here is method for opening capturing camera image activity.

private static final int CAMERA_PHOTO = 111;
private Uri imageToUploadUri;

private void captureCameraImage() {
        Intent chooserIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File f = new File(Environment.getExternalStorageDirectory(), "POST_IMAGE.jpg");
        chooserIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
        imageToUploadUri = Uri.fromFile(f);
        startActivityForResult(chooserIntent, CAMERA_PHOTO);
    }

然后您的onActivityResult()方法应如下所示.

then your onActivityResult() method should be like this.

  @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == CAMERA_PHOTO && resultCode == Activity.RESULT_OK) {
                if(imageToUploadUri != null){
                    Uri selectedImage = imageToUploadUri;
                    getContentResolver().notifyChange(selectedImage, null);
                    Bitmap reducedSizeBitmap = getBitmap(imageToUploadUri.getPath());
                    if(reducedSizeBitmap != null){
                        imageview.setImageBitmap(reducedSizeBitmap);
                    }else{
                        Toast.makeText(this,"Error while capturing Image",Toast.LENGTH_LONG).show();
                    }
                }else{
                    Toast.makeText(this,"Error while capturing Image",Toast.LENGTH_LONG).show();
                }
            } 
        }

这是onActivityResult()中使用的getBitmap()方法.

Here is getBitmap() method used in onActivityResult().

private Bitmap getBitmap(String path) {

        Uri uri = Uri.fromFile(new File(path));
        InputStream in = null;
        try {
            final int IMAGE_MAX_SIZE = 1200000; // 1.2MP
            in = getContentResolver().openInputStream(uri);

            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(in, null, o);
            in.close();


            int scale = 1;
            while ((o.outWidth * o.outHeight) * (1 / Math.pow(scale, 2)) >
                    IMAGE_MAX_SIZE) {
                scale++;
            }
            Log.d("", "scale = " + scale + ", orig-width: " + o.outWidth + ", orig-height: " + o.outHeight);

            Bitmap b = null;
            in = getContentResolver().openInputStream(uri);
            if (scale > 1) {
                scale--;
                // scale to max possible inSampleSize that still yields an image
                // larger than target
                o = new BitmapFactory.Options();
                o.inSampleSize = scale;
                b = BitmapFactory.decodeStream(in, null, o);

                // resize to desired dimensions
                int height = b.getHeight();
                int width = b.getWidth();
                Log.d("", "1th scale operation dimenions - width: " + width + ", height: " + height);

                double y = Math.sqrt(IMAGE_MAX_SIZE
                        / (((double) width) / height));
                double x = (y / height) * width;

                Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x,
                        (int) y, true);
                b.recycle();
                b = scaledBitmap;

                System.gc();
            } else {
                b = BitmapFactory.decodeStream(in);
            }
            in.close();

            Log.d("", "bitmap size - width: " + b.getWidth() + ", height: " +
                    b.getHeight());
            return b;
        } catch (IOException e) {
            Log.e("", e.getMessage(), e);
            return null;
        }
    }

希望对您有帮助!

这篇关于android位图质量低下的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆