web-dev-qa-db-fra.com

Android - Intention de l'appareil photo faible qualité bitmap

Lorsque je prends une photo avec l'objectif de l'appareil photo Android, je reçois une image bitmap de qualité médiocre. Je me demandais s'il était possible de rendre cette image de qualité décente.

J'ai googlé quelques informations à ce sujet et je pense que je dois utiliser 'EXTRA_OUTPUT' ( http://developer.Android.com/reference/Android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE )

Je me bats parce que je ne sais pas où le placer et je ne sais pas si cela résoudra mon problème.

Après avoir appuyé sur btnTakePhoto, je change de présentation et ouvre la caméra Android. Le bitmap apparaît dans une seconde mise en page (basse qualité). Voici mon code:

import Android.content.Intent;
import Android.graphics.Bitmap;
import Android.provider.MediaStore;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import Android.widget.ImageButton;
import Android.widget.ImageView;

public class Camera extends AppCompatActivity {
    ImageButton btnTakePhoto;
    ImageView imgTakenPhoto;
    private static final int CAM_REQUEST = 1313;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);

        btnTakePhoto = (ImageButton) findViewById(R.id.buttonFoto);
        imgTakenPhoto = (ImageView) findViewById(R.id.genomenFoto);


    btnTakePhoto.setOnClickListener(new btnTakePhotoClicker());
}
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == CAM_REQUEST){
            setContentView(R.layout.share);
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
            imgTakenPhoto = (ImageView) findViewById(R.id.genomenFoto);
            imgTakenPhoto.setImageBitmap(thumbnail);
        }
    }

    class btnTakePhotoClicker implements Button.OnClickListener {

        @Override
        public void onClick(View v) {
            Intent cameraIntent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAM_REQUEST);
        }
    }

    //CameraShare layout -- back button - Go back to first layout
    public void ibBackToPhotograph(View v) {
        setContentView(R.layout.camera);
        btnTakePhoto = (ImageButton) findViewById(R.id.buttonFoto);
        btnTakePhoto.setOnClickListener(new btnTakePhotoClicker());
    }
}

EDIT: L'image n'est enregistrée nulle part. Il est conseillé de poster sur facebook après l'avoir accepté (Snapchat)

7
Meindert Stijfhals

N'utilisez pas bitmap, utilisez plutôt uri.

 ImageView imageView;
 Uri image;
 String mCameraFileName;

 private void cameraIntent() {
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
        Intent intent = new Intent();
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);

        Date date = new Date();
        DateFormat df = new SimpleDateFormat("-mm-ss");

        String newPicFile = df.format(date) + ".jpg";
        String outPath = "/sdcard/" + newPicFile;
        File outFile = new File(outPath);

        mCameraFileName = outFile.toString();
        Uri outuri = Uri.fromFile(outFile);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outuri);
        startActivityForResult(intent, 2);
    }

  @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 2) {
                if (data != null) {
                    image = data.getData();
                    imageView.setImageURI(image);
                    imageView.setVisibility(View.VISIBLE);
                }
                if (image == null && mCameraFileName != null) {
                    image = Uri.fromFile(new File(mCameraFileName));
                    imageView.setImageURI(image);
                    imageView.setVisibility(View.VISIBLE);
                }
                File file = new File(mCameraFileName);
                if (!file.exists()) {
                    file.mkdir();
                }
            }
        }
    }
7
John Joe

dans votre cameraIntent, vous devez spécifier l'URI à laquelle l'activité de la caméra enregistrera l'image avec la pleine résolution:

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri);

si vous ne spécifiez pas que vous ne recevez qu'une vignette dans onActivityResult. Donc, vous spécifiez cela et vous lisez l'image à partir de l'URI.

Donc, dans votre onActivityResult, vous devriez faire:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(capturedImageUri, options);

c'est tout.

4
whd.nsr

Vous devez enregistrer l'image dans le stockage afin d'obtenir l'image en taille réelle. Vérifiez ceci: http://developer.Android.com/training/camera/photobasics.html#TaskPath

0
Drilon Blakqori