如何缩小从图库中选取的图像的大小(mb)

时间:2018-12-29 21:44:46

标签: java android

当用户从图库中选择图像时,我将其转换为base64字符串。然后,我使用API​​。图片大小必须小于2MB,因此,如果图库中的图片大于2MB,则需要减小其大小。 我该怎么办?

那是我的代码:

// I pass the URI of the image to the method
@Override
    protected Integer doInBackground(Uri... uris) {

        InputStream inputStream = null;
        try {
            inputStream = getContentResolver().openInputStream(uris[0]);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        byte[] buffer = new byte[8192];
        int bytesRead;
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        try {
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        bytes = output.toByteArray();
        String encodedImage = Base64.encodeToString(bytes, Base64.NO_WRAP);

2 个答案:

答案 0 :(得分:0)

您可以使用创建一个位图对象

BitmapFactory.decodeByteArray

  

从指定的字节数组中解码不可变的位图。

然后您可以使用

bitmap.compress

  

将位图的压缩版本写入指定的   输出流。如果返回true,则可以通过以下方式重建位图:   将相应的输入流传递给BitmapFactory.decodeStream()。   注意:并非所有格式都直接支持所有位图配置,因此   从BitmapFactory返回的位图可能位于   位深度不同,和/或可能丢失了每个像素的Alpha(例如JPEG   仅支持不透明像素。

     

此方法可能需要花费几秒钟才能完成,因此只能   从工作线程调用。

和/或

Bitmap.createScaledBitmap

  

在可能的情况下,根据现有位图创建新的位图。   如果指定的宽度和高度与当前宽度相同   和源位图的高度,则返回源位图,并且没有   创建新的位图。

在我的项目中,我创建了两个实用程序功能,这些功能可以帮助您了解如何使用上面提到的功能来满足您的需求

public static Bitmap base64ToBitmap(String encodedImage) {
    byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
    return BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
}

public static String bitmapToBase64(Bitmap bitmap, int quality, int percentScale) {
    if (quality < 0 || quality > 100) {
        quality = IMAGE_QUALITY_DEFAULT_VALUE;
    }
    if (percentScale < 0 || percentScale > 100) {
        percentScale = IMAGE_SCALE_DEFAULT_VALUE;
    }

    float scale = (float) percentScale / 100;
    int width = Math.round(bitmap.getWidth() * scale);
    int height = Math.round(bitmap.getHeight() * scale);
    bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    return Base64.encodeToString(byteArray, Base64.NO_WRAP);
}

答案 1 :(得分:0)

一种轻松检查图像并将其存储的方法是根据开发人员文档 https://developer.android.com/topic/performance/graphics/load-bitmap#java 这可以正确解释您的答案,而另一种方法是更改​​可以在此处找到的图像的大小,然后相应地使用它 https://developer.android.com/reference/android/graphics/drawable/ScaleDrawable