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.
- Configuración de orientación múltiple - Android
- Android RatingBar - un completo desastre
- Establecer ID de recurso extraíble en android: src para ImageView utilizando el enlace de datos en Android
- Añadir relleno en vista de forma programática
- GetWidth devuelve 0 en Fragment, getPaddingLeft devuelve no-cero
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
- La mejor manera de posicionar la imagen en el mismo lugar en todos los dispositivos?
- Android - ListView - llamando al getView () bajo demanda
- Aclaración sobre la propiedad de clipToPadding de Android
- Notificación personalizada con vista remota en Android
- Cambiar programaticamente el color de la forma en la lista de capas
- Selección de recursos de Android y valores e inconsistencias
- ¿Los recursos extraíbles de caché de Android se cargan en archivos de diseño xml?
- Eclipse no puede encontrar android.support.v4.widget.SwipeRefreshLayout
¿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).
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
- Método de desplazamiento no compatible en android appium
- ¿Cómo abrir la pantalla de escaneo "zxing Barcode" en una pequeña ventana?