下面是处理图片的工具类:
public class BitmapUtil {
/**
* 获取小尺寸的照片
*
* @param filePath 压缩照片的路径
* @return 返回压缩处理后的照片
*/
public static Bitmap getBitmap(String filePath) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//只读取图片,不加载到内存中
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = Math.max(1, (int) Math.ceil(Math.max(
(double) options.outWidth / 1024f,
(double) options.outHeight / 1024f)));
options.inJustDecodeBounds = false;//加载到内存中
bitmap = BitmapFactory.decodeFile(filePath, options);
return bitmap;
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// 文件提供
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// 外部存储设备提供
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/"
+ split[1];
}
// TODO handle non-primary volumes
}
// 下载文件提供
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// 媒体提供
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = MediaStore.MediaColumns._ID + "=?";
final String[] selectionArgs = new String[]{split[1]};
return getDataColumn(context, contentUri, selection,
selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* Get the value of the data column for this Uri . This is useful for
* MediaStore Uris , and other file - based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @param selection (Optional) Filter used in the query.
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri,
String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = MediaStore.MediaColumns.DATA;
final String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection,
selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri
.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri
.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri
.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri
.getAuthority());
}
public static byte[] getBitmapByte(Bitmap bitmap) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
return out.toByteArray();
}
}
使用方法:
private void openGallery(int num) {
RxGalleryFinal.with(ApplicationLike.appContext)
.image()
.gif(true)
.multiple()
.maxSize(num)
.imageLoader(ImageLoaderType.GLIDE)
.subscribe(new RxBusResultDisposable<ImageMultipleResultEvent>() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onEvent(ImageMultipleResultEvent event) throws Exception {
if (null != event && null != event.getResult() && event.getResult().size() > 0) {
if (cordovaCallbackContext != null) {
ArrayList<MediaBean> result = (ArrayList<MediaBean>) event.getResult();
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < result.size(); i++) {
Uri originalUri = Uri.parse("file://" + result.get(i).getOriginalPath());
Uri thumbnailBigUri = Uri.parse("file://" + result.get(i).getThumbnailSmallPath());
String path = BitmapUtil.getPath(ApplicationLike.appContext, originalUri);
Bitmap bitmap = BitmapUtil.getBitmap(path);
jsonArray.put("data:image/png;base64," + Base64.encodeToString(BitmapUtil.getBitmapByte(bitmap), Base64.URL_SAFE));
}
cordovaCallbackContext.success(jsonArray);
}
}
}
@Override
public void onComplete() {
super.onComplete();
}
}).openGallery();
//得到图片多选的事件
RxGalleryListener.getInstance().setMultiImageCheckedListener(new IMultiImageCheckedListener() {
@Override
public void selectedImg(Object t, boolean isChecked) {
//这个主要点击或者按到就会触发,所以不建议在这里进行Toast
}
@Override
public void selectedImgMax(Object t, boolean isChecked, int maxSize) {
ToastUtil.showToast("您最多只能选择" + maxSize + "张图片");
}
});
}
其中RxGalleryFinal为从相册中获取图片的开源框架,地址为:GitHub - FinalTeam/RxGalleryFinal
重点代码:
"data:image/png;base64," + Base64.encodeToString(BitmapUtil.getBitmapByte(bitmap), Base64.URL_SAFE));
1. Base64.encodeToString(BitmapUtil.getBitmapByte(bitmap), Base64.URL_SAFE)将bitmap转换为Base64处理后的字符串。
2. "data:image/png;base64," 是网页加载图片需要的 ,必须拼接到前面。想要了解跟多请借鉴: https://blog.csdn.net/lidongliangzhicai/article/details/95030067