web-dev-qa-db-fra.com

Comment capturer une image à partir de la vue Appareil photo personnalisée dans Android?

j'ai besoin de capturer l'image de portion requise du .

capturer l'image à partir de appareil photo.

à ce moment autre contenu d'écran tel qu'il est .

enter image description here

comment est-ce possible?

36
Mr.Sandy

essayez d'utiliser Vue de surface pour créer une vue dynamique caméra et définissez la portion requise.

essai de code suivant

les variables définissent le niveau de classe (global)

Button btn_capture;
Camera camera1;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
public static boolean previewing = false;

Code suivant dans la méthode onCreate ()

getWindow().setFormat(PixelFormat.UNKNOWN);
    surfaceView = new SurfaceView(this);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);
btn_capture = (Button) findViewById(R.id.button1);

surfaceView.setBackgroundResource(R.drawable.your_background_image);

if(!previewing){

        camera1 = Camera.open();
        if (camera1 != null){
            try {
                camera1.setDisplayOrientation(90);
                camera1.setPreviewDisplay(surfaceHolder);
                camera1.startPreview();
                previewing = true;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

btn_capture.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            if(camera != null)
            {
                camera1.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);

            }
        }
    });

Le code suivant place après onCreate () dans votre classe .

ShutterCallback myShutterCallback = new ShutterCallback(){

    public void onShutter() {
        // TODO Auto-generated method stub
    }};

PictureCallback myPictureCallback_RAW = new PictureCallback(){

    public void onPictureTaken(byte[] arg0, Camera arg1) {
        // TODO Auto-generated method stub
    }};

PictureCallback myPictureCallback_JPG = new PictureCallback(){

    public void onPictureTaken(byte[] arg0, Camera arg1) {
        // TODO Auto-generated method stub
        Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);

        Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, 0, 0, bitmapPicture.getWidth(), bitmapPicture.getHeight(), null, true);

    }};

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub
    if(previewing){
        camera1.stopPreview();
        previewing = false;
    }

    if (camera1 != null){
        try {
            camera1.setPreviewDisplay(surfaceHolder);
            camera1.startPreview();
            previewing = true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

        camera1.stopPreview();
        camera1.release();
        camera1 = null;
        previewing = false;

}

dans AndroidManifest.xml donne autorisations utilisateur.

<uses-permission Android:name="Android.permission.CAMERA"/>
<uses-feature Android:name="Android.hardware.camera" Android:required="false"/>
<uses-feature Android:name="Android.hardware.camera.front" Android:required="false"/>

et aussi pas oublié (implémente SurfaceHolder.Callback) à la classe.

29
user2126788

J'ai déjà créé ce genre d'appareil photo. Ce que j'ai fait, c'est que j'ai recouvert l'autre zone de l'appareil photo avec une image, et coupé la partie centrale de l'image et l'enregistrer en tant que fichier png, pour rendre le centre transparent.

Vous allez définir l'image d'arrière-plan de votre cadre (aperçu de la caméra) avec cette image. Pour qu'il ressemble à la caméra, il n'y a que la partie transparente ou le cercle.

J'ai utilisé ce tutoriel pour ouvrir, créer un aperçu et prendre des photos à partir de l'appareil photo http://developer.Android.com/guide/topics/media/camera.html

dans cette partie (vous pouvez le voir dans le lien que je fournis ci-dessus)

 private PictureCallback mPicture = new PictureCallback() {

 @Override
 public void onPictureTaken(byte[] data, Camera camera) {
   //this is where you crop your image
    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inMutable = true;
    Bitmap bitmap = BitmapFactory
            .decodeByteArray(data, 0, data.length, opt);

    bitmap=Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
    Canvas mcanvas=new Canvas(bitmap);
    //do the cropping here, bitmap is the image you will use to crop

  }

 }

suivez ce tutoriel sur la façon de recadrer l'image en cercle Recadrage d'une zone circulaire à partir d'un bitmap dans Android

4
She Smile GM

vous pouvez utiliser la vue de surface.Après avoir capturé l'image, vous pouvez obtenir un bitmap et dessiner une toile également

http://developer.Android.com/reference/Android/view/View.html#onDraw (Android.graphics.Canvas)

http://developer.Android.com/reference/Android/view/SurfaceView.html#setZOrderMediaOverlay (boolean)

2
Digvijay Aghera

Si la partie de l'écran est en fait une vue, vous ne pouvez capturer que cette vue. Comme ça:

Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),view.getHeight(),Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);

Si vous souhaitez capturer uniquement une petite partie d'une vue, vous devez calculer le rectangle de ce côté. Ensuite:

Bitmap bitmap = Bitmap.createBitmap(rect.width(),rect.height(),Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.save();
canvas.translate(-rect.left,-rect.top);
view.draw(canvas);
canvas.restore();

Ce n'est qu'un pseudocode, mais j'espère que vous avez compris l'idée. Traduisez et dessinez simplement la partie dont vous avez besoin.

1
Zielony

utilisez TextureView pour l'aperçu, définissez layout_width et layout_height comme bon vous semble. voici le code:

public class MainActivity extends Activity implements TextureView.SurfaceTextureListener {
    private Camera mCamera;
    private TextureView mTextureView;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mTextureView = (TextureView) findViewById(R.id.textureView);
        mTextureView.setSurfaceTextureListener(this);
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) {
        mCamera = Camera.open();

        try {
            mCamera.setPreviewTexture(surfaceTexture);
            mCamera.setDisplayOrientation(90);
            mCamera.startPreview();
        } catch (IOException exception) {

        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        mCamera.startPreview();
        mCamera.release();
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}

et fichier xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    >

    <TextureView
        Android:layout_gravity="center"
        Android:id="@+id/textureView"
        Android:layout_width="200dp"
        Android:layout_height="300dp"/>
</LinearLayout>
1
kidfolk

J'utilise CameraPreview dans l'application ApiDemos et le modifie selon vos besoins.

Tout d'abord, copiez le code de la classe Preview dans un nouveau fichier de classe dans le même package afin qu'il soit public et que vous puissiez le déclarer dans le fichier de disposition xml. N'oubliez pas d'ajouter un constructeur de plus comme ci-dessous:

public Preview(Context context, AttributeSet attrs) {
    super(context, attrs);
    mSurfaceView = new SurfaceView(context);
    addView(mSurfaceView);

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = mSurfaceView.getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);
}

Exemple de fichier de disposition avec largeur et hauteur d'échantillon:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <TextView 
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="Abow"/>

   <com.example.Android.apis.graphics.Preview
       Android:id="@+id/camera_view"
       Android:layout_width="240dp"
       Android:layout_height="180dp">
   </com.example.Android.apis.graphics.Preview>     

   <TextView 
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="Below"/>

</LinearLayout>

Dans la méthode onCreate () de l'activité CameraPreview, modifiez la partie setContentView comme suit:

setContentView(R.layout.camera_layout);
mPreview = (Preview) findViewById(R.id.camera_view);
1
Binh Tran