30

Ich muss Capture Bildvonerforderlichen Abschnitt des Bildschirm.Wie kann ich ein Bild von einem benutzerdefinierten CameraView in Android aufnehmen?

Aufnahme Bild von Kamera.

zu dieser Zeit anderen Bildschirminhalt wie es ist.

enter image description here

wie ist das möglich ?

+0

Verwenden Sie die Kamera Absicht oder Sie App implementieren Sie eigene Kamera Vorschau Oberfläche? – Derzu

+0

Sie möchten die Vorschau auf Vollbild anzeigen und nur die Region mit der Bezeichnung "Kameraansicht" speichern? Oder möchtest du, dass die Vorschau nur in der Region mit der Bezeichnung "Kameraansicht" angezeigt wird? – Derzu

+5

Ich möchte, dass die Vorschau nur in der Region mit der Bezeichnung "Kameraansicht" angezeigt wird. und ich bin Camera Intent verwendet. –

Antwort

24

versuchen Oberflächenansicht für Erstellung dynamischerKamera Ansicht und stellen Sie in Ihren gewünschten Teil zu verwenden.

folgenden Code versuchen

Variablen Klassenstufe (Global)

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

folgenden Code in onCreate() Methode

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

      } 
     } 
    }); 

Code Nach setzen nach onCreate () in Ihre Klasse.

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; 

} 

in AndroidManifest.xml geben Benutzer-Berechtigungen.

<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"/> 

und auch nicht (implementiert SurfaceHolder.Callback) vergessen der Klasse.

+1

+1 funktioniert einwandfrei !!! –

+0

Funktioniert für mich;) – Reshma

1

Wenn der Teil des Bildschirms tatsächlich eine Ansicht ist, können Sie nur diese Ansicht erfassen. Beispiel:

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

Wenn Sie nur einen kleinen Teil einer Ansicht erfassen möchten, müssen Sie das Rechteck dieser Seite berechnen. Dann:

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(); 

Es ist nur ein Pseudocode, aber ich hoffe, Sie bekommen die Idee. Übersetzen und zeichnen Sie einfach nur das Teil, das Sie benötigen.

+5

ich denke, Sie wissen dies @Zielony, aber Sie können meine Anforderungen nicht perfekt verstehen. Bitte sagte mir, wie kann ich die Kamera in diesem Teil nur von meinem Vollbild einstellen? und ein Bild davon aufnehmen. nach diesem Bitmap und Canvas zum Zeichnen und Speichern von Bildern für andere Zwecke. –

+0

Wenn Sie nur einen Teil des von der Kamera aufgenommenen Bildes benötigen, können Sie das Bild einfach zuschneiden. Nehmen Sie das Bild auf: http://stackoverflow.com/questions/5991319/capture-image-from-camera-and-display-in-activity und dann schneiden Sie es mit Bitmap.createBitmap mit x, y, Breite, Höhe Parameter. – Zielony

+5

no..no..i muss nicht Bild beschneiden, aber ich brauche, wenn ich die Kamera öffne, ist es nicht im Vollbildmodus geöffnet, sondern nur in Teil des Bildschirms geöffnet, der dafür eingestellt ist. wie oben abgebildet. –

1

ich die CameraPreview in ApiDemos Anwendung verwenden und es als Ihre Anforderung bearbeiten.

Kopieren Sie zunächst den Code der Preview-Klasse in eine neue Klassendatei im selben Paket, sodass sie öffentlich ist, und Sie können sie in der XML-Layoutdatei deklarieren. Denken Sie daran, einen weiteren Konstruktor hinzufügen, wie unten:

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

Musterlayout-Datei mit Probenbreite und Höhe:

<?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> 

Im onCreate() Methode der CameraPreview Aktivität, ändern die setContentView Teil wie folgt:

1

Verwenden Sie TextureView für die Vorschau, legen Sie layout_width und layout_height was auch immer Sie wollen. hier ist der 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. 
    } 
} 

und xml-Datei:

<?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

Es ist erwähnenswert, dass 'TextureView' erst mit ICS (API Level 14) eingeführt wurde. –

3

ich schon wie diese Art von Kamera erstellt. Was ich getan habe, ist, dass ich den anderen Bereich der Kamera mit einem Bild bedeckte und den mittleren Teil des Bildes ausschnitt und es als PNG-Datei speicherte, um das Zentrum transparent zu machen.

Sie werden das Hintergrundbild Ihres Rahmens (Kameravorschau) mit diesem Bild einstellen. Damit es so aussieht, als sei die Kamera nur der Teil, der transparent ist oder der Kreis.

ich dieses Tutorial zu öffnen, erstellen Vorschau, und nehmen Bild von Kameravorrichtung http://developer.android.com/guide/topics/media/camera.html

in diesem Teil (u kann ich bieten in den obigen Link sehen dies)

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 

    } 

} 

diese folgen Tutorial zum Beschneiden des Bildes zu Kreis Cropping circular area from bitmap in Android

+0

Diese Lösungen funktionieren jedoch nicht, wenn ein Gesicht erkannt und automatisch erfasst werden soll, da es außerhalb des kreisförmigen Bereichs liegen könnte – Neha