Tome la foto de lo que hay dentro de los límites de superposición
Estoy tratando de desarrollar esta sencilla aplicación que toma fotos. Todo esta bien. La única cosa que tengo un tamaño fijo de forma ovalada imageview en el centro de mi preview.Capturing de la imagen está funcionando bien, pero el problema es que quiero capturar la imagen y recortar automáticamente que se encuentra dentro de la forma ovalada imageview.I no quiere toda la imagen Para ser salvo, sólo quiero la parte de la imagen que se encuentra dentro de la forma. Ahora, no sé cómo proceder. Después de horas gastadas en Google para las soluciones decidí que tuve que dar para arriba y venir aquí. No estoy consiguiendo que cómo puedo conseguir solamente esa porción de la imagen que miente dentro de la forma ( Esa imagen de forma oval fija).
Aquí está mi código: –
- Android ¿Cómo enviar texto e imágenes o cualquier objeto con intención?
- Android Reconocimiento facial y obtener caras similares de la base de datos
- Imagen de círculo con texto
- Diferencia en la representación de la imagen sobre la versión androide diferente
- Xamarin.Forms ListView OutOfMemoryError excepción en Android
public class MainActivity extends Activity implements SurfaceHolder.Callback { Camera camera; SurfaceView surfaceView; SurfaceHolder surfaceHolder; boolean cameraview = false; LayoutInflater inflater = null; private ImageView ImgContainer; private Button btn; private ImageView mIvCaptureImage; FrameLayout frameLayout; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); getWindow().setFormat(PixelFormat.UNKNOWN); frameLayout = (FrameLayout) findViewById(R.id.view); surfaceView = (SurfaceView) findViewById(R.id.camera_preview); ImgContainer = (ImageView) findViewById(R.id.Img_container); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // GuideBox box = new GuideBox(MainActivity.this); // llContainer.addView(box, new LayoutParams(LayoutParams.WRAP_CONTENT, // LayoutParams.WRAP_CONTENT)); btn = (Button) findViewById(R.id.button); mIvCaptureImage = (ImageView) findViewById(R.id.imageview1); btn.setOnClickListener(new OnClickListener() { @SuppressWarnings("deprecation") @Override public void onClick(View v) { if (camera != null) { camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG); } } }); } @TargetApi(Build.VERSION_CODES.GINGERBREAD) @SuppressWarnings("deprecation") @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub if (cameraview) { camera.stopPreview(); cameraview = false; } if (camera != null) { try { setCameraDisplayOrientation(this, CameraInfo.CAMERA_FACING_BACK, camera); camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); cameraview = true; } catch (IOException e) { e.printStackTrace(); } } } @TargetApi(Build.VERSION_CODES.GINGERBREAD) @SuppressWarnings("deprecation") private void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); } ShutterCallback myShutterCallback = new ShutterCallback() { public void onShutter() { // TODO Auto-generated method stub } }; PictureCallback myPictureCallback_RAW = new PictureCallback() { @Override public void onPictureTaken(byte[] data, android.hardware.Camera camera) { // TODO Auto-generated method stub } }; PictureCallback myPictureCallback_JPG = new PictureCallback() { @Override public void onPictureTaken(byte[] data, android.hardware.Camera camera) { // TODO Auto-generated method stub Rect rc = getViewPositionRelative(); Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, data.length); Matrix mat = new Matrix(); mat.postRotate(90); Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, rc.left, rc.top, ImgContainer.getWidth(), ImgContainer.getHeight(), mat, true); // Bitmap circularBitmap = ImageConverter.getRoundedCornerBitmap( // correctBmp, 100); mIvCaptureImage.setImageBitmap(correctBmp); } }; public Rect getViewPositionRelative() { // Locate on screen int[] location = new int[2]; ImgContainer.getLocationOnScreen(location); Rect rect = new Rect(); rect.left = location[0]; rect.top = location[1]; rect.right = rect.left + ImgContainer.getWidth(); rect.bottom = rect.top + ImgContainer.getHeight(); return rect; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub camera = Camera.open(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub camera.stopPreview(); camera.release(); camera = null; cameraview = false; } }
Segundo Enfoque: –
PictureCallback myPictureCallback_JPG = new PictureCallback() { @Override public void onPictureTaken(byte[] data, android.hardware.Camera camera) { Boolean isSDPresent = android.os.Environment .getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); // checking for SD card if (isSDPresent) { mediaStorageDir = new File(Environment .getExternalStorageDirectory().getAbsolutePath(), IMAGE_DIRECTORY_NAME); mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); // Create the storage directory if it does not exist if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { } } try { Bitmap userImage = BitmapFactory.decodeByteArray(data, 0, data.length); // set file out stream FileOutputStream out = new FileOutputStream(mediaFile); // set compress format quality and stream userImage.compress(Bitmap.CompressFormat.JPEG, 100, out); ByteArrayOutputStream baos = new ByteArrayOutputStream(); userImage.compress(Bitmap.CompressFormat.JPEG, 100, baos); try { out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { Toast.makeText(getApplicationContext(), "Please insert SD card !", Toast.LENGTH_LONG).show(); } if (mediaStorageDir.exists()) { getPathOfCapturedImage(); } } }; private void getPathOfCapturedImage() { final String ImagePath = mediaFile.getAbsolutePath(); Bitmap bitmap = BitmapFactory.decodeFile(ImagePath); int bitWidth = bitmap.getWidth(); int bitHeight = bitmap.getHeight(); // 3. Size of camera preview on screen int preWidth = surfaceView.getWidth(); int preHeight = surfaceView.getHeight(); Rect rc = getViewPositionRelative(); Matrix mat = new Matrix(); mat.postRotate(90); int startx = rc.left * bitWidth / preWidth; int starty = rc.top * bitHeight / preHeight; int endx = rc.right * bitWidth / preWidth; int endy = rc.bottom * bitHeight / preHeight; Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, startx, starty, endx, endy); mIvCaptureImage.setImageBitmap(resizedBitmap); } public Rect getViewPositionRelative() { // Locate on screen int[] location = new int[2]; ImgContainer.getLocationOnScreen(location); Rect rect = new Rect(); rect.left = location[0]; rect.top = location[1]; rect.right = rect.left - ImgContainer.getWidth(); rect.bottom = rect.top - ImgContainer.getHeight(); return rect; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub camera = Camera.open(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub camera.stopPreview(); camera.release(); camera = null; cameraview = false; }
Xml:
<?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" > <FrameLayout android:id="@+id/view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight=".6" > <SurfaceView android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" /> <ImageView android:id="@+id/Img_container" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/eclipce"/> </FrameLayout> <ImageView android:id="@+id/imageview1" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight=".2" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="0dp" android:layout_gravity="center" android:layout_weight=".2" android:orientation="horizontal" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Capture" /> </LinearLayout> </LinearLayout>
Así que por favor, si alguien sabe algo, házmelo saber.
Gracias
- Android Flip ImageView verticalmente
- Universal-Image-Loader | SSLHandshakeException: El apretón de manos falló
- Necesito establecer la ruta para guardar las imágenes con una aplicación para Android e IOS con UNITY
- Visualización de una imagen más grande que la pantalla del dispositivo
- Obtener contactos de fotos que se sincronizan con facebook para android
- Obteniendo el ancho y altura de la imagen con la biblioteca picasso
- AFNetworking para Android
- Burbuja de discurso drawable de Android
He estado jugando con esto un poco. He aquí cómo lo solucioné:
1) Apenas tome la imagen, con todo su pix glorioso. Sí, esto es mucho más de lo que quieres.
2) Obtener las proporciones de su superposición. Ahora ya sabes dónde recortar.
3) Deje que la computadora haga el trabajo de cálculo duro, es bueno en ello.
Mi – código no completo: (parte de él, dibuja un rectángulo sobre una foto para recortarlo)
ArrayList<int []> userPoints = new ArrayList<>(); /** * Method to Crop the image * * @param width Width of the output image, in mm. * @param height Height of the output image, in mm. */ private void cropImage(int width, int height) { Paint paint = new Paint(); paint.setAntiAlias(false); paint.setFilterBitmap(false); int output_width_start = 0; int output_width_end = (width * 5) / 2; int output_height_start = 0; int output_height_end = (height * 5) / 2; Matrix matrix = new Matrix(); matrix.setPolyToPoly( // where to take it from new float[]{ userPoints.get(0)[0], userPoints.get(0)[1], userPoints.get(1)[0], userPoints.get(1)[1], userPoints.get(2)[0], userPoints.get(2)[1], userPoints.get(3)[0], userPoints.get(3)[1]}, 0, // what it should be new float[]{ output_width_start, output_height_start, output_width_end, output_width_start, output_width_end, output_height_end, output_height_start, output_height_end}, 0, 4); Uri image_uri = Uri.fromFile(file); // get where the temp is stored Bitmap bitmap = BitmapFactory.decodeFile(image_uri.getPath()); canvasRectangle.drawBitmap(bitmap, matrix, paint); } private void scaleImage(ImageView image) { Matrix matrix = image.getImageMatrix(); RectF drawableRect = new RectF(userPoints.get(0)[0], userPoints.get(0)[1], 400, 300); RectF viewRect = new RectF(0, 0, imageViewPhoto.getWidth(), imageViewPhoto.getHeight()); matrix.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER); imageViewPhoto.setImageMatrix(matrix); }
- Cambio del brillo de la pantalla en un dispositivo HTC Sense
- Gradle – DependencySubstitution para la aplicación de Android con una biblioteca