如何在将图片上传到Firebase之前重新调整图片大小?

时间:2018-02-01 12:16:21

标签: java android image firebase firebase-storage

之前我看过这个问题,但没有一个解决方案真的适合我的情况。

除了节省一些空间之外,我还想节省从Firebase存储上传/下载内容的时间。由于firebase使用图像uri,我无法想到实现这一目标的正确方法。

解决方案可能是创建缓存的“副本”或一些临时文件来调整大小,裁剪等,然后将该副本上传到存储。但是我不知道这是不是一个好方法,我真的不知道该怎么做。

你会建议一些方法吗?我非常感谢你的例子。

3 个答案:

答案 0 :(得分:4)

您可以使用一些自定义libraries来压缩图片和视频等媒体文件。例如: Compressor 是压缩图片的好库:https://github.com/zetbaitsu/Compressor

要压缩图像并在Firebase Storage上传,您可以执行以下操作:

try {
                Bitmap bitmap = new Compressor(this)
                        .setMaxHeight(200) //Set height and width
                        .setMaxWidth(200)
                        .setQuality(100) // Set Quality
                        .compressToBitmap(file);
            } catch (IOException e) {
                e.printStackTrace();
            }

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            final byte[] bytes = baos.toByteArray();

然后调用并设置UploadTask

UploadTask uploadTask = StorageReference.putBytes(bytes);

当然还有其他一些libraries喜欢:

<强> SiliCompressor

https://github.com/Tourenathan-G5organisation/SiliCompressor

答案 1 :(得分:3)

使用第三方库,简单高效

摇篮

dependencies {
    compile 'id.zelory:compressor:2.1.0'
}

压缩图像文件

compressedImageFile = new Compressor(this).compressToFile(actualImageFile);

压缩图像文件到位图

compressedImageBitmap = new Compressor(this).compressToBitmap(actualImageFile);

有关详细信息,请访问此

https://github.com/zetbaitsu/Compressor

希望这会有所帮助,因为我总是使用这个库。

答案 2 :(得分:0)

您可以使用此库

Gradle

dependencies {
        implementation 'com.github.WindSekirun:MediaResizer:1.0.0' 
}

allprojects {
    repositories {
     maven { url 'https://jitpack.io' }
    }

压缩图像

ImageResizeOption resizeOption = new ImageResizeOption.Builder()
            .setImageProcessMode(ImageMode.ResizeAndCompress)
            .setImageResolution(1280, 720)
            .setBitmapFilter(false)
            .setCompressFormat(Bitmap.CompressFormat.JPEG)
            .setCompressQuality(75)
            .setScanRequest(ScanRequest.TRUE)
            .build();

ResizeOption option = new ResizeOption.Builder()
            .setMediaType(MediaType.IMAGE)
            .setImageResizeOption(resizeOption)
            .setTargetPath(path)
            .setOutputPath(imageFile.getAbsolutePath())
            .setCallback((code, output) -> {
                txtStatus.setText(ResultBuilder.displayImageResult(code, path, output));
                progress.dismiss();
            }).build();

MediaResizer.process(option);