26

我正在开发一个应用程序,我需要从中选择一个图像sd card并在图像视图中显示它。现在我希望用户通过单击一个按钮来减小/增加其宽度,然后将其保存回 sd 卡。

我已经完成了图像挑选并在 ui 上显示它。但无法找到如何调整它。任何人都可以建议我如何实现它。

4

7 回答 7

50

就在昨天我做了这个

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:它会节省内存。

您还可以获得新创建的文件字符串的路径:newPath=file.getAbsolutePath();

于 2012-07-27T13:46:34.470 回答
13

没有OutOfMemoryExceptionKotlin 的解决方案

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()
    }
}
于 2017-09-05T10:58:25.630 回答
3

尝试使用此方法:

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);  
} 
于 2012-07-27T13:42:27.033 回答
1

您可以使用Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)

于 2012-07-27T13:44:15.750 回答
1

我为这个成就找到了这个有用的库:https ://github.com/hkk595/Resizer

于 2020-03-03T13:43:45.767 回答
1

这是我的静态方法:

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();
    }
}
于 2021-02-24T16:30:42.817 回答
0

理想情况下,您应该使用多点触控而不是使用按钮来增加/减少宽度。这是一个了不起的图书馆。一旦用户决定保存图像,图像转换矩阵必须永久存储(在您的 sqlite 数据库中)。下次用户打开图像时,您需要调用矩阵并将其应用于图像。

我以前确实这样做过。

于 2012-07-27T13:47:52.047 回答