我正在开发一款安卓应用,该应用具有相机捕获和照片上传功能。如果设备具有高分辨率照相机,拍摄的图像尺寸将非常大(1〜3MB或更多)。
由于应用程序需要将此图像上传到服务器,因此我需要在上传前压缩图像。例如,如果相机捕获1920x1080全分辨率照片,理想的输出是保持图像的16:9比例,将其压缩为640x360图像,以降低某些图像质量并使其以较小的字节数进行缩小。Android - 缩放并压缩位图
这是我的代码(来自谷歌引用):
/**
* this class provide methods that can help compress the image size.
*
*/
public class ImageCompressHelper {
/**
* Calcuate how much to compress the image
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height/2;
final int halfWidth = width/2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight/inSampleSize) > reqHeight
&& (halfWidth/inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
/**
* resize image to 480x800
* @param filePath
* @return
*/
public static Bitmap getSmallBitmap(String filePath) {
File file = new File(filePath);
long originalSize = file.length();
MyLogger.Verbose("Original image size is: " + originalSize + " bytes.");
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
// Calculate inSampleSize based on a preset ratio
options.inSampleSize = calculateInSampleSize(options, 480, 800);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap compressedImage = BitmapFactory.decodeFile(filePath, options);
MyLogger.Verbose("Compressed image size is " + sizeOf(compressedImage) + " bytes");
return compressedImage;
}
与上述代码的问题是:
- 它不能保持率,代码迫使图像大小调整为为480x800。如果用户以另一个比例捕捉图像,压缩后图像看起来不太好。
它运行不正常。无论原始文件大小如何,代码将始终将图像大小更改为7990272byte。如果原始图像尺寸是非常小的已经,它将使大(我的测试结果把我的墙,这是非常单色的图片):
Original image size is: 990092 bytes.
Compressed image size is 7990272 bytes
我在问是否有更好的方式来压缩照片,以便它可以顺利上传的建议?
的大小代替使用硬编码的480×800大小 - 你应该计算出维持所需的纵横比i动态输出位图的大小。e改变风景和人像。对于图像大小 - 请记住,您正在比较原始*压缩*文件大小与缩放*未压缩*位图大小。 – harism