Android壓縮圖片後再上傳圖片
在Android開發中上傳圖片(頭像)到伺服器,要先壓縮圖片,獲取原圖的長寬,然後取得壓縮比例,compress到指定的質量,輸出儲存,然後網路上傳這張圖片就行了。之前分享了web前端壓縮圖片的方式:
web前端之HTML5壓縮圖片compress image with canvas
1,乾言
如果圖片太大,上傳不僅耗時,而且體驗不好。即使加了loading效果,那還是挺耗流量的。so,果斷要壓縮圖片再上傳,android客戶端,尤其要注意。
2,圖片上傳
壓縮原圖後儲存在sdcard臨時目錄,如果壓縮後的圖片存在,就上傳壓縮的圖片,沒有壓縮成功(不存在),就直接上原圖吧。
// 壓縮圖片並上傳
private void uploadFileInThreadByOkHttp(final Activity context, final String actionUrl, final File tempPic) {
final String pic_path = tempPic.getPath();
String targetPath = FileUtils.getThumbDir()+"compressPic.jpg";
//呼叫壓縮圖片的方法,返回壓縮後的圖片path
final String compressImage = PictureUtil.compressImage(pic_path, targetPath, 30);
final File compressedPic = new File(compressImage);
if (compressedPic.exists()) {
LogUtils.debug(TAG,"圖片壓縮上傳");
uploadFileByOkHTTP(context, actionUrl, compressedPic);
}else{//直接上傳
uploadFileByOkHTTP(context, actionUrl, tempPic);
}
}
3,壓縮圖片的關鍵程式碼
public static String compressImage(String filePath, String targetPath, int quality) {
Bitmap bm = getSmallBitmap(filePath);//獲取一定尺寸的圖片
int degree = readPictureDegree(filePath);//獲取相片拍攝角度
if(degree!=0){//旋轉照片角度,防止頭像橫著顯示
bm=rotateBitmap(bm,degree);
}
File outputFile=new File(targetPath);
try {
if (!outputFile.exists()) {
outputFile.getParentFile().mkdirs();
//outputFile.createNewFile();
}else{
outputFile.delete();
}
FileOutputStream out = new FileOutputStream(outputFile);
bm.compress(Bitmap.CompressFormat.JPEG, quality, out);
}catch (Exception e){}
return outputFile.getPath();
}
/**
* 根據路徑獲得圖片資訊並按比例壓縮,返回bitmap
*/
public static Bitmap getSmallBitmap(String filePath) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//只解析圖片邊沿,獲取寬高
BitmapFactory.decodeFile(filePath, options);
// 計算縮放比
options.inSampleSize = calculateInSampleSize(options, 480, 800);
// 完整解析圖片返回bitmap
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath, options);
}
/**
* 獲取照片角度
* @param path
* @return
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/**
* 旋轉照片
* @param bitmap
* @param degress
* @return
*/
public static Bitmap rotateBitmap(Bitmap bitmap,int degress) {
if (bitmap != null) {
Matrix m = new Matrix();
m.postRotate(degress);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), m, true);
return bitmap;
}
return bitmap;
}
public static 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;
}
4,上傳圖片
使用okhttp,如果不太熟悉okhttp的話,可以看我的另一博文:
Android網路請求:OkHttp實戰
本文上傳頭像,封裝uploadFile方法如下:
/**
* 上傳檔案
* @param url 介面地址
* @param file 上傳的檔案
* @param mediaType 資源mediaType型別:比如 MediaType.parse("image/png");
* @param responseCallback 回撥方法,在子執行緒,更新UI要post到主執行緒
* @return
*/
public boolean uploadFile(String url, File file, MediaType mediaType, Callback responseCallback) {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MediaType.parse("multipart/form-data"));
if (!file.exists()|| TextUtils.isEmpty(url)){
return false;
}
//addFormDataPart視專案自身的情況而定
//builder.addFormDataPart("description","2.jpg");
builder.addFormDataPart("file", file.getName(), RequestBody.create(mediaType, file));
//構建請求體
RequestBody requestBody = builder.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
enqueue(request,responseCallback);
return true;
}
其中的RequestBody大概是這樣的:
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MediaType.parse("multipart/form-data")); builder.addFormDataPart("description","duqian.jpg");
builder.addFormDataPart("file", "Dusan.jpg", RequestBody.create(MEDIA_TYPE_PNG, new File(photoPath)));
5,over,休息
哈哈,簡單,如果遇到上傳檔案的格式限制,和後臺協調下。親測,圖片壓縮效果明顯,不影響清晰度。你也可以自己改質量,寬高,確定壓縮後的圖片,網路框架嘛,很多,看個人習慣咯。
歡迎交流,Dusan,291902259,OpenDeveloper。
需要android頂尖學習資料和VIP視訊的可以加我Q:291902259。
相關文章
- vue 上傳圖片進行壓縮圖片Vue
- js上傳圖片壓縮JS
- android下圖片壓縮Android
- 前端的圖片壓縮image-compressor(可在圖片上傳前實現圖片壓縮)前端
- java後臺壓縮圖片Java
- Android 載入大圖片,不壓縮圖片Android
- 前端圖片壓縮及上傳前端
- 前端圖片壓縮 - H5&Uni-App圖片壓縮前端H5APP
- Android如何壓縮圖片上傳服務端Android服務端
- ??圖片壓縮CanvasCanvas
- IOS圖片壓縮iOS
- canvas 壓縮圖片Canvas
- JS—圖片壓縮上傳(單張)JS
- Android 中圖片壓縮分析(上)Android
- 圖片壓縮知識梳理(0) 圖片壓縮學習計劃
- 【前端】壓縮圖片以及圖片相關概念前端
- iOS 圖片壓縮方法iOS
- 前端圖片壓縮方案前端
- layui中實現上傳圖片壓縮UI
- ionic3 上傳圖片、壓縮圖片到阿里雲 服務端簽名後直傳阿里服務端
- java,springboot + thymeleaf 上傳圖片、刪除圖片到伺服器、本地,壓縮圖片上傳(有些圖片會失真),原圖上傳JavaSpring Boot伺服器
- android圖片壓縮不失真實戰Android
- 如何使用FormData上傳壓縮裁剪後的圖片Blob物件ORM物件
- 怎麼轉換圖片格式並壓縮圖片
- android短視訊開發,呼叫相機、相簿,壓縮圖片後上傳Android
- 一個Vue圖片上傳剪裁壓縮元件Vue元件
- SmallImage for Mac(圖片壓縮工具)Mac
- js圖片壓縮推薦JS
- JNI實現圖片壓縮
- 開源圖片工具箱(Img Toolbox) 格式轉換 新增水印 圖片壓縮 圖片裁剪 圖片旋轉 圖片縮放
- Android 端 WebP 圖片壓縮與傳輸的一點探索AndroidWeb
- 圖片壓縮怎樣操作?分享幾種實用的批次圖片壓縮技巧
- Android-圖片壓縮(二)-純乾貨Android
- android 比較靠譜的圖片壓縮Android
- 仿寫一個android圖片壓縮工具Android
- Android 圖片壓縮方法分析與學習Android
- Android 圖片縮放Android
- Android-壓縮大圖到容量超小的圖片Android