studio programacion herramientas fundamentos crear con avanzado aplicaciones android image image-processing imageview surfaceview

programacion - Cómo hacer una vista de cámara de recorte en SurfaceView Android



manual android studio avanzado (2)

Quiero crear una aplicación de recorte usando SurfaceView en el sistema operativo Android. He creado una superficie de visualización para mostrar la cámara de visualización directa, pero sigo fallando cuando quiero agregar una función de recorte directamente en la pantalla de la cámara. Las ediciones de figuras debajo de esto van a lograr:

Cuando se hace clic en el botón de captura, el resultado de las imágenes aparecerá en la pantalla, como se muestra a continuación:

El siguiente es el código fuente MainActivity.java

package com.example.CameraPreview1; import java.io.IOException; import java.util.List; import curso.citic15.camara.R; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.Camera; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.Toast; public class MainActivity extends Activity implements SurfaceHolder.Callback, Camera.ShutterCallback, Camera.PictureCallback { private SurfaceView Surface; Camera camera; Bitmap InputImages; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Surface = (SurfaceView) findViewById(R.id.surface); Surface.getHolder().addCallback(this); ImageButton shutter = (ImageButton) findViewById(R.id.button_capture); shutter.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { camera.takePicture(MainActivity.this, null, null, MainActivity.this); } }); } @Override protected void onDestroy() { super.onDestroy(); camera.release(); } @Override protected void onPause() { super.onPause(); camera.stopPreview(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onShutter() { // TODO Auto-generated method stub } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (camera != null) { Camera.Parameters params = camera.getParameters(); List<Camera.Size> sizes = params.getSupportedPreviewSizes(); Camera.Size selected = sizes.get(0); params.setPreviewSize(selected.width, selected.height); camera.setParameters(params); camera.setDisplayOrientation(90); try { camera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } camera.startPreview(); } else { Toast.makeText(this, "No hay camara o hay algœn error.", Toast.LENGTH_LONG).show(); } } @Override public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d("", "Destroyed"); } @Override public void onPictureTaken(byte[] data, Camera camera) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 6; InputImages = BitmapFactory.decodeByteArray(data, 0, data.length, options); camera.startPreview(); } }

y debajo está el código fuente main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <SurfaceView android:id="@+id/surface" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" /> <ImageButton android:id="@+id/button_2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="15dp" android:layout_marginRight="20dp" android:src="@drawable/dua" android:background="@null" /> <ImageButton android:id="@+id/button_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_marginBottom="15dp" android:layout_marginLeft="20dp" android:src="@drawable/satu" android:background="@null" /> <ImageButton android:id="@+id/button_capture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="10dp" android:src="@drawable/capture" android:background="@null" /> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@null" /> </RelativeLayout>

He estado buscando en Google, pero ninguno de los tutoriales que ofrecen las cosas que quería, tenía un poco de estrés y desesperación. ¿Ayudarás a resolver los problemas mencionados anteriormente? Estaría muy feliz si eso ayuda. Muchas gracias


debe guardar la imagen de mapa de bits antes del recorte.

croppedBitmap = Bitmap.createBitmap(cameraBitmap, x,y, cameraBitmap.getWidth(), cameraBitmap.getHeight());

después de sobrescribir a la misma ruta de su imagen original


Mira este tutorial Muestra una vista previa de la cámara y una vista personalizada que puede definir su región para recortar, arrastrando. Puede modificarlo según sus necesidades. Los únicos problemas que pude encontrar son con la orientación de la pantalla, que modifican la vista previa y la imagen resultante.

http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/