Elija la imagen de la tarjeta SD, cambie el tamaño de la imagen y guárdela de nuevo en la tarjeta SD

Estoy trabajando en una aplicación, en la que necesito elegir una imagen de sd card y mostrarlo en vista de imagen. Ahora quiero que el usuario disminuya/aumente su ancho haciendo clic en un botón y luego vuelva a guardarlo en la tarjeta SD.

He seleccionado la imagen y la he mostrado en la interfaz de usuario. Pero no puedo encontrar cómo cambiar su tamaño. ¿Puede alguien sugerirme cómo lograrlo?

preguntado el 27 de julio de 12 a las 14:07

7 Respuestas

Solución sin OutOfMemoryException en Kotlin

fun resizeImage(file: File, scaleTo: Int = 1024) {
    val bmOptions = BitmapFactory.Options()
    bmOptions.inJustDecodeBounds = true
    BitmapFactory.decodeFile(file.absolutePath, bmOptions)
    val photoW = bmOptions.outWidth
    val photoH = bmOptions.outHeight

    // Determine how much to scale down the image
    val scaleFactor = Math.min(photoW / scaleTo, photoH / scaleTo)

    bmOptions.inJustDecodeBounds = false
    bmOptions.inSampleSize = scaleFactor

    val resized = BitmapFactory.decodeFile(file.absolutePath, bmOptions) ?: return
    file.outputStream().use {
        resized.compress(Bitmap.CompressFormat.JPEG, 75, it)
        resized.recycle()
    }
}

Respondido el 05 de Septiembre de 17 a las 11:09

Justo ayer hice esto

File dir=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
Bitmap b= BitmapFactory.decodeFile(PATH_ORIGINAL_IMAGE);
Bitmap out = Bitmap.createScaledBitmap(b, 320, 480, false);

File file = new File(dir, "resize.png");
FileOutputStream fOut;
try {
    fOut = new FileOutputStream(file);
    out.compress(Bitmap.CompressFormat.PNG, 100, fOut);
    fOut.flush();
    fOut.close();
    b.recycle();
    out.recycle();               
} catch (Exception e) {}

Además, no olvides reciclar tu bitmaps: Ahorrará memoria.

También puede obtener la ruta del nuevo archivo creado Cadena: newPath=file.getAbsolutePath();

contestado el 15 de mayo de 15 a las 21:05

BitmapFactory.decodeFile().............. esto generará una excepción OOM al abrir imágenes de gran tamaño, necesita usar "opciones" para abrir y si lo hace obtendrá una reducción versión de la imagen original........ - jxgn

y necesito alejar la imagen original y guardarla y no en la imagen alterada... y me di cuenta de esto en la aplicación de galería en sí... agregué algunos efectos a la imagen de tamaño 6.33 MB y después de los efectos el tamaño era de 507 KB... gran pérdida de información y no quiero eso... - jxgn

Está funcionando bien, pero cómo preservar la calidad de la imagen. - Akshay Kumar

Aquí mi método estático:

public static void resizeImageFile(File originalImageFile, File resizedImageFile, int maxSize) {
    Bitmap bitmap = BitmapFactory.decodeFile(originalImageFile.getAbsolutePath());
    Bitmap resizedBitmap;
    if (bitmap.getWidth() > bitmap.getHeight()) {
        resizedBitmap = Bitmap.createScaledBitmap(bitmap, maxSize, maxSize * bitmap.getHeight() / bitmap.getWidth(), false);
    } else {
        resizedBitmap = Bitmap.createScaledBitmap(bitmap, maxSize * bitmap.getWidth() / bitmap.getHeight(), maxSize, false);
    }

    FileOutputStream fileOutputStream;
    try {
        fileOutputStream = new FileOutputStream(resizedImageFile);
        resizedBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
        bitmap.recycle();
        resizedBitmap.recycle();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Respondido 24 Feb 21, 16:02

Encontré esta biblioteca útil para este logro: https://github.com/hkk595/Resizer

respondido 03 mar '20, 13:03

Idealmente, debería usar multitouch en lugar de usar un botón para aumentar/disminuir el ancho. aquí está una biblioteca increíble. Una vez que el usuario decide guardar la imagen, la matriz de traducción de imágenes debe almacenarse de forma persistente (en su base de datos sqlite). La próxima vez que el usuario abra la imagen, debe recuperar la matriz y aplicarla a su imagen.

De hecho, he hecho esto antes.

Respondido 27 Jul 12, 14:07

Intente usar este método:

public static Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight) {   
if(bitmapToScale == null)
    return null;
//get the original width and height
int width = bitmapToScale.getWidth();
int height = bitmapToScale.getHeight();
// create a matrix for the manipulation
Matrix matrix = new Matrix();

// resize the bit map
matrix.postScale(newWidth / width, newHeight / height);

// recreate the new Bitmap and set it back
return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix, true);  
} 

Respondido 27 Jul 12, 14:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.