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

Java 如何在上传到Firebase之前重新调整图像大小?,java,android,image,firebase,firebase-storage,Java,Android,Image,Firebase,Firebase Storage,我以前见过这个问题,但没有一个解决方案真正适合我的情况 除了节省一些空间之外,我还想节省从Firebase存储上传/下载内容的时间。由于firebase使用图像uri,我想不出一个合适的方法来实现这一点 解决方案可能是创建一个到缓存的“副本”或一些临时文件以调整大小、裁剪等,然后将该副本上载到存储器。然而,我不知道这是否是一个好的方法,我真的不知道如何做到这一点 你能建议一些方法吗?我很欣赏这些例子 使用第三方库,简单高效 格拉德尔 dependencies { compile 'id.

我以前见过这个问题,但没有一个解决方案真正适合我的情况

除了节省一些空间之外,我还想节省从Firebase存储上传/下载内容的时间。由于firebase使用图像uri,我想不出一个合适的方法来实现这一点

解决方案可能是创建一个到缓存的“副本”或一些临时文件以调整大小、裁剪等,然后将该副本上载到存储器。然而,我不知道这是否是一个好的方法,我真的不知道如何做到这一点


你能建议一些方法吗?我很欣赏这些例子

使用第三方库,简单高效

格拉德尔

dependencies {
    compile 'id.zelory:compressor:2.1.0'
}
压缩图像文件

compressedImageFile = new Compressor(this).compressToFile(actualImageFile);
将图像文件压缩为位图

compressedImageBitmap = new Compressor(this).compressToBitmap(actualImageFile);
欲了解更多信息,请访问


希望这对我一直使用这个库有所帮助。

您可以使用一些定制的
库来压缩图像和视频等媒体文件。例如:压缩程序是压缩图像的良好库:

要压缩图像并上传到
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 = StorageReference.putBytes(bytes);
当然还有其他一些
,如:

硅压缩机


您可以使用此库

格拉德尔

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);

感谢您的回答,我尝试了您的代码,但我得到了以下结果:
FileNotFoundException:/primary:Pictures/night\u sky\u moon\u trees\u river\u reflection\u 95979\u 1920x1080.jpg(没有这样的文件或目录)
这是一个文件:
新文件(data.getClipData().getItemAt(I.getUri().getLastPathSegment())
是从ImageChooser提交的,这是另一个
异常
,当您尝试读取文件时会引发该异常,或者文件不存在或者读取设置不正确。是的,我知道异常意味着什么,但是如果uri直接来自ImageChooser,它怎么可能是错误的?同样的uri在上面的类中工作。谢谢
Log
如果
Uri
不是
null
,那么可能没有带有该
路径的图像。您还可以使用云函数触发器编写代码,在上载完成时自动执行调整大小@DougStevenson,我真的很喜欢这种方法,但我以前从未使用过云功能,它是免费的还是付费的?我会更仔细地研究的,谢谢