gpt4 book ai didi

android - 如何在Android中压缩图像文件?

转载 作者:行者123 更新时间:2023-11-29 01:14:44 25 4
gpt4 key购买 nike

所以对于每张图片我都有它的路径(以字符串的形式)。我将该路径字符串转换为文件。然后我将该文件存储到 Firebase 存储中,但我的问题是查询时文件太大。所以我需要在上传它之前压缩它 Firebase 存储。我环顾四周,但从未找到关于如何做到这一点的明确解决方案。请如果有人可以帮助我提供非常清晰和简单的解决方案,那将是很棒的。下面是我的代码。

for(String path : images)
{
try {
InputStream stream = new FileInputStream(new File(path));
UploadTask uploadTask = imageStorage.putStream(stream);
uploadTask.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
Log.d("myStorage","failure :(");
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
UrI downloadUrl = taskSnapshot.getDownloadUrl();
Log.d("myStorage","success!");
}
});
} catch (FileNotFoundException e) {
e.printStackTrace();
}
countDB++;

}

最佳答案

我有一个用于 Firebase 存储的图像压缩自定义类,并且大小显着减小。

此类可用于在发送到 Firebase 之前压缩位图和文件

public class ImageCompression {

public static Bitmap getThumbnail(Uri uri, Context context) throws FileNotFoundException, IOException {
InputStream input = context.getContentResolver().openInputStream(uri);

BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options();
onlyBoundsOptions.inJustDecodeBounds = true;
onlyBoundsOptions.inDither = true;//optional
onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional
BitmapFactory.decodeStream(input, null, onlyBoundsOptions);
input.close();
if ((onlyBoundsOptions.outWidth == -1) || (onlyBoundsOptions.outHeight == -1))
return null;

int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight : onlyBoundsOptions.outWidth;

double ratio = (originalSize > 500) ? (originalSize / 500) : 1.0;

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio);
bitmapOptions.inDither = true;//optional
bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;//optional
input = context.getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions);
input.close();
return bitmap;
}

private static int getPowerOfTwoForSampleRatio(double ratio) {
int k = Integer.highestOneBit((int) Math.floor(ratio));
if (k == 0) return 1;
else return k;
}

public static File compressFile(File file, Context context) {
try {

// BitmapFactory options to downsize the image
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
o.inSampleSize = 6;
// factor of downsizing the image

FileInputStream inputStream = new FileInputStream(file);
//Bitmap selectedBitmap = null;
BitmapFactory.decodeStream(inputStream, null, o);
inputStream.close();

// The new size we want to scale to
final int REQUIRED_SIZE = 75;

// Find the correct scale value. It should be the power of 2.
int scale = 1;
while (o.outWidth / scale / 2 >= REQUIRED_SIZE &&
o.outHeight / scale / 2 >= REQUIRED_SIZE) {
scale *= 2;
}

BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
inputStream = new FileInputStream(file);

Bitmap selectedBitmap = BitmapFactory.decodeStream(inputStream, null, o2);
inputStream.close();

// here i override the original image file
file.createNewFile();
FileOutputStream outputStream = new FileOutputStream(file);

selectedBitmap.compress(Bitmap.CompressFormat.JPEG, 50, outputStream);

return file;
} catch (Exception e) {
return null;
}
}
}



ImageCompression.compressFile(YourFile, this);
ImageCompression.getThumbnail(YourUri, this);

关于android - 如何在Android中压缩图像文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40602694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com