【发布时间】:2014-01-03 04:32:41
【问题描述】:
我正在开发一款具有相机拍摄和照片上传功能的安卓应用。如果设备有高分辨率的摄像头,捕获的图像尺寸会非常大(1~3MB 或更大)。
由于应用程序需要将此图像上传到服务器,因此我需要在上传之前压缩图像。例如,如果相机拍摄 1920x1080 全分辨率照片,理想的输出是保持图像的 16:9 比例,将其压缩为 640x360 图像以降低一些图像质量并使其尺寸更小(以字节为单位)。
这是我的代码(来自google):
/**
* 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。如果用户以其他比例捕获图像,则图像在压缩后会看起来不太好。
-
它不能正常工作。无论原始文件大小如何,代码都会始终将图像大小更改为 7990272 字节。如果原始图像尺寸已经很小,它会变大(我的测试结果是给我的墙拍照,它几乎是单色的):
Original image size is: 990092 bytes.Compressed image size is 7990272 bytes
请问有没有更好的压缩照片的方法,可以顺利上传?
【问题讨论】:
-
而不是使用硬编码的 480x800 大小 - 您应该计算一个动态输出位图大小,以保持所需的纵横比,即横向和纵向变化。对于图像大小 - 请记住,您将原始 压缩 文件大小与缩放 未压缩 位图大小进行比较。
标签: java android image image-processing bitmap