Cómo limitar la dimensión mínima capaz de cultivar una imagen en android

Hay un poco de hablar sobre cómo recortar una imagen tomada de Galería o Cámara. Una muy simple, que no mucha gente como, incluye el siguiente fragmento

intent.putExtra("crop", "true"); intent.putExtra("aspectX", 617); intent.putExtra("aspectY", 619); 

(De todos modos, el fragmento está destinado a ser incompleto.

Observe cómo en el fragmento utilizo dos números primos grandes. Yo estaba aquí con la esperanza de restringir la dimensión mínima del cultivo. 617X619 parece no tener ningún efecto, sin embargo; Que para mí básicamente significa que cualquier algoritmo se ha utilizado tiene una función similar a

 double scale = (double) aspectY/aspectX; 

Que luego se utiliza para hacer coincidir xDimen con yDimen.

Pero antes de echar las manos al aire y darse por vencido, me di cuenta de que Instagram ha logrado con éxito limitar la dimensión mínima del cultivador. ¿Alguien sabe cómo podría lograr esto? Básicamente, si utiliza instagram, notará que no puede recortar una parte "demasiado pequeña" de una imagen. ¿Cómo puedo decidir esas dimensiones?

Básicamente es como si Instagram estuviera haciendo

  double scale = (double) aspectY/aspectX; //.... if(someInputX > aspectX){ xDimen = someInputX; yDimen = scale* xDimen; }else{ //do not crop any further } 

He estado buscando en algunas bibliotecas de cultivo para ver si puedo averiguar cómo arreglar las dimensiones mínimas, pero no puedo entenderlo. Por ejemplo, he estado estudiando los proyectos git vinculados a http://commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent.html

¿Está abierto a usar bibliotecas de terceros? Si es así, puede usar este y cambiarlo para que limite el tamaño mínimo del rectángulo (no creo que permita que por defecto, pero es fácil agregarlo al código si realmente lo desea).

https://github.com/edmodo/cropper

Instagram ha construido su propia herramienta de recorte. Si está listo para construir una herramienta de recorte puede controlar cualquier cosa. Y no es tan difícil de construir una simple herramienta de recorte. Si tiene una buena comprensión de MotionEvent y cómo funciona Bitmap , es trabajo de 1 hora para usted.

Ejemplo de código: tomado de aquí

 public class MainActivity extends Activity { private ImageView imageView; private ViewManager viewManager; private Matrix matrix; private int size; private final int outputSize = 100; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); size = width < height ? width : height; size -= 50; imageView = (ImageView) findViewById(R.id.imageViewCrop); imageView.getLayoutParams().width = size; imageView.getLayoutParams().height = size; viewManager = (ViewManager) imageView.getParent(); if (getPackageManager().hasSystemFeature( PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH)) { createZoomControls(); } imageView.setOnTouchListener(new OnTouchListener() { float initX; float initY; float midX; float midY; float scale; float initDistance; float currentDistance; boolean isMultitouch = false; public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: initX = event.getX(); initY = event.getY(); break; case MotionEvent.ACTION_POINTER_DOWN: isMultitouch = true; initDistance = (float) Math.sqrt(Math.pow( initX - event.getX(1), 2) + Math.pow(initY - event.getY(1), 2)); break; case MotionEvent.ACTION_MOVE: if (isMultitouch) { matrix = imageView.getImageMatrix(); currentDistance = (float) Math.sqrt(Math.pow(initX - event.getX(1), 2) + Math.pow(initY - event.getY(1), 2)); scale = 1 + 0.001f * (currentDistance - initDistance); midX = 0.5f * (initX + event.getX(1)); midY = 0.5f * (initY + event.getY(1)); matrix.postScale(scale, scale, midX, midY); imageView.setImageMatrix(matrix); imageView.invalidate(); } else { imageView.scrollBy((int) (initX - event.getX()), (int) (initY - event.getY())); initX = event.getX(); initY = event.getY(); } break; case MotionEvent.ACTION_UP: isMultitouch = false; break; case MotionEvent.ACTION_POINTER_UP: isMultitouch = false; break; } return true; } }); } public void createZoomControls() { ZoomButtonsController zoomButtonsController = new ZoomButtonsController( imageView); zoomButtonsController.setVisible(true); zoomButtonsController.setAutoDismissed(false); zoomButtonsController.setOnZoomListener(new OnZoomListener() { public void onZoom(boolean zoomIn) { matrix = imageView.getImageMatrix(); if (zoomIn) { matrix.postScale(1.05f, 1.05f, 0.5f * size, 0.5f * size); imageView.setImageMatrix(matrix); } else { matrix.postScale(0.95f, 0.95f, 0.5f * size, 0.5f * size); imageView.setImageMatrix(matrix); } imageView.invalidate(); } public void onVisibilityChanged(boolean visible) { } }); RelativeLayout.LayoutParams zoomLayoutParams = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); zoomLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL); zoomLayoutParams.addRule(RelativeLayout.BELOW, R.id.imageViewCrop); viewManager.addView(zoomButtonsController.getContainer(), zoomLayoutParams); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { Toast.makeText(this, R.string.info, 5).show(); return super.onMenuItemSelected(featureId, item); } public void buttonPickClick(View view) { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 0); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (resultCode) { case RESULT_OK: Uri targetUri = data.getData(); imageView.setScaleType(ScaleType.CENTER_INSIDE); imageView.scrollTo(0, 0); imageView.setImageURI(targetUri); imageView.setScaleType(ScaleType.MATRIX); break; } } public void buttonCropClick(View view) throws IOException { imageView.setDrawingCacheEnabled(true); imageView.buildDrawingCache(true); File imageFile = new File(Environment.getExternalStorageDirectory(), "Pictures/" + UUID.randomUUID().toString() + ".jpg"); FileOutputStream fileOutputStream = new FileOutputStream(imageFile); Bitmap.createScaledBitmap(imageView.getDrawingCache(true), outputSize, outputSize, false).compress(CompressFormat.JPEG, 100, fileOutputStream); fileOutputStream.close(); imageView.setDrawingCacheEnabled(false); } } 

Tenga cuidado al procesar imágenes de alta resolución http://developer.android.com/training/displaying-bitmaps/index.html

  • Los eventos de TextWatcher se disparan varias veces
  • Espaciado entre los elementos de listView Android
  • Después de Upate Android SDK - Diseño no se muestra
  • IPhone como cabezal deslizante, o: ¿cómo forzar el redibujo inmediato en el cambio de margen superior?
  • Fragmento de fragmento de Android como fragmento de diálogo o fragmento habitual
  • ¿Cómo configuro LAYOUTGRAVITY para un TextView en Android?
  • ¿Cómo dar dos enlaces para móviles y tabletas en la vista web?
  • ¿Cómo colocar un ListView dentro de otro ListView ...?
  • La aplicación se bloquea y muestra un error en el hilo (señal fatal)
  • Establecer texto en TextView utilizando Html.fromHtml
  • Persistente BottomSheet peekHeight y STATE_COLLAPSED no dibujar correctamente en Inicio de actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.