gpt4 book ai didi

android将相机捕获的图像的文件大小减小到小于500 kb

转载 作者:IT老高 更新时间:2023-10-28 23:06:55 30 4
gpt4 key购买 nike

我的要求是将相机捕获的图像上传到服务器,但它应该小于 500 KB。如果大于 500 KB,则需要减小到小于 500 KB (但稍微接近)

为此,我使用以下代码 -

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == getActivity().RESULT_OK) {

if (requestCode == REQUEST_CODE_CAMERA) {

try {

photo = MediaStore.Images.Media.getBitmap(
ctx.getContentResolver(), capturedImageUri);
String selectedImagePath = getRealPathFromURI(capturedImageUri);

img_file = new File(selectedImagePath);

Log.d("img_file_size", "file size in KBs (initially): " + (img_file.length()/1000));

if(CommonUtilities.isImageFileSizeGreaterThan500KB(img_file)) {
photo = CommonUtilities.getResizedBitmapLessThan500KB(photo, 500);
}
photo = CommonUtilities.getCorrectBitmap(photo, selectedImagePath);


// // CALL THIS METHOD TO GET THE URI FROM THE BITMAP

img_file = new File(ctx.getCacheDir(), "image.jpg");
img_file.createNewFile();

//Convert bitmap to byte array
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

//write the bytes in file
FileOutputStream fo = new FileOutputStream(img_file);
fo.write(bytes.toByteArray());

// remember close de FileOutput
fo.close();
Log.d("img_file_size", "file size in KBs after image manipulations: " + (img_file.length()/1000));


} catch (Exception e) {
Logs.setLogException(class_name, "onActivityResult(), when captured from camera", e);
}


}

}
} catch (Exception e) {
Logs.setLogException(class_name, "onActivityResult()", e);
} catch (OutOfMemoryError e) {
Logs.setLogError(class_name, "onActivityResult()", e);

}
}

public static Bitmap getResizedBitmapLessThan500KB(Bitmap image, int maxSize) {
int width = image.getWidth();
int height = image.getHeight();



float bitmapRatio = (float)width / (float) height;
if (bitmapRatio > 0) {
width = maxSize;
height = (int) (width / bitmapRatio);
} else {
height = maxSize;
width = (int) (height * bitmapRatio);
}
Bitmap reduced_bitmap = Bitmap.createScaledBitmap(image, width, height, true);
if(sizeOf(reduced_bitmap) > (500 * 1000)) {
return getResizedBitmap(reduced_bitmap, maxSize);
} else {
return reduced_bitmap;
}
}

根据需要旋转图像。

public static Bitmap getCorrectBitmap(Bitmap bitmap, String filePath) {
ExifInterface ei;
Bitmap rotatedBitmap = bitmap;
try {
ei = new ExifInterface(filePath);

int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.postRotate(90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.postRotate(180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.postRotate(270);
break;
}

rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rotatedBitmap;
}

这是图像文件大小最初的输出以及所有减小文件大小的操作之后的输出。

img_file_size﹕ file size in KBs (initially): 3294

img_file_size﹕ file size in KBs after image manipulations: 235

查看上面的区别(在输出中)。没有这些操作的初始文件大小,以及那些压缩和其他操作之后的文件大小。我需要这个大小接近 500 kb。

上面的代码对我来说工作得很好,因为它减少了图像文件的大小,使其小于 500 KB。

但是,以下是上述代码的问题 -

  • 即使文件小于 500 KB,此代码也会减小文件大小

  • 如果超过 500 KB,则缩小后的文件大小会从 500 KB 变得太小,尽管我需要更接近一些。

我需要摆脱以上 2 个问题。所以,需要知道我应该在上面的代码中操作什么。

因为我还想纠正 EXIF 方向(旋转图像),以及我上面提到的要求。

最佳答案

您可以在调整大小之前检查大小。如果位图大小大于 500kb,则调整其大小。

也为了使更大的位图接近 500kb 大小,检查大小之间的差异并相应地压缩。

if(sizeOf(reduced_bitmap) > (500 * 1024)) {
return getResizedBitmap(reduced_bitmap, maxSize, sizeOf(reduced_bitmap));
} else {
return reduced_bitmap;
}

并在resize Bitmap中计算大小差异并相应压缩

关于android将相机捕获的图像的文件大小减小到小于500 kb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37299490/

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