一、图片压缩的必要性
在移动应用开发中,图片上传是很常见的操作,但是大图上传的时间和流量不只会浪费用户的时间和流量,而且还会对服务器造成负担,因为服务器需要承载大量的数据,如果全部是原图的话,肯定会对服务器的性能造成一定的影响。为了缓解这样的状况,处理图片上传就成了一项非常重要的内容。
所以,在进行图片上传之前,我们需要对图片进行一些必要的处理,这里讲解一下android源码是如何实现图片压缩和上传的。
二、图片的处理流程
在Android中,处理图片上传的步骤大概分为以下几个方面:
1、选择图片
首先,需要使用系统自带的图库或者相机等工具选择一个图片进行上传。
private void selectImage() {
final CharSequence[] items =
{ "从相册选取", "拍照" };
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("选择图片来源:");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (items[item].equals("从相册选取")) {
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, IMAGE_PICKER_SELECT);
} else if (items[item].equals("拍照")) {
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, IMAGE_CAPTURE_SELECT);
}
}
});
builder.create().show();
}
2、先对图片进行压缩处理
使用Android提供的Bitmap类获取原图,并进行相应的处理,代码如下:
private Bitmap getSmallBitmap(String filePath) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = calculateInSampleSize(options, 480, 800);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
return bitmap;
}
private int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height
/ (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
3、将处理后的图片上传到服务器
将图像压缩后,再将之上传到服务器即可,以下是上传过程的代码:
private void upload(String path) {
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("username", "testuser")
.addFormDataPart("password", "testpwd")
.addFormDataPart("file", path.substring(path.lastIndexOf("/") + 1),
RequestBody.create(MediaType.parse("application/octet-stream"),
new File(path)))
.build();
Request request = new Request.Builder()
.url("http://your.upload.api/url")
.post(requestBody)
.build();
OkHttpClient client = new OkHttpClient();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
Log.d(TAG, response.body().string());
} else {
throw new IOException("Unexpected code " + response);
}
}
});
}
三、总结
本文介绍了Android源码中实现图片压缩和上传的流程。通过对图片进行压缩处理,可以保证上传的图片大小变小,而且还可以减轻服务器的压力。通过示例代码,希望能够帮助读者更好地理解图片上传的流程和代码实现。