Выберите изображение с SD-карты, измените размер изображения и сохраните его на SD-карте
Я работаю над приложением, в котором мне нужно выбрать изображение из sd card
и показать его в представлении изображения. Теперь я хочу, чтобы пользователь уменьшал/увеличивал свою ширину, нажимая кнопку, а затем сохраняя ее обратно на SD-карту.
Я сделал подбор изображений и покажу его на ui. Но не могу найти, как изменить его размер. Кто-нибудь может предложить мне, как его достичь.
Ответы
Ответ 1
Только вчера я сделал это
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) {}
Также не забудьте переработать bitmaps
: он сохранит память.
Вы также можете получить путь к новому созданному файлу String: newPath=file.getAbsolutePath();
Ответ 2
Попробуйте использовать этот метод:
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);
}
Ответ 3
Решение без OutOfMemoryException
в Котлине
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()
}
}
Ответ 4
Вы можете использовать Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)
Ответ 5
В идеале вы должны использовать мультитач вместо использования кнопки для увеличения/уменьшения ширины. Вот потрясающая библиотека. После того, как пользователь решит сохранить изображение, матрица преобразования изображений должна храниться постоянно (в вашей базе данных sqlite). В следующий раз, когда пользователь откроет изображение, вам нужно вызвать матрицу и применить ее к вашему изображению.
Я уже делал это раньше.