上传图片选择方式
以Base64的方式进行上传
//需要将文件或者bitmap转化为String字符串
public String file2String(String path) {
File file = new File(path);
String string = null;
FileInputStream inputFile = null;
try {
inputFile = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
inputFile.read(buffer);
inputFile.close();
string = Base64.encodeToString(buffer, Base64.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
return string;
}
public String bitmap2String(String path) {
Bitmap bitmap = BitmapFactory.decodeFile(path);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
if (bitmap != null) {
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bos);
}
byte[] bytes=bos.toByteArray();
String string = Base64.encodeToString(bytes, Base64.DEFAULT);
return string;
}
获取图片uri
根据相对路径(/storage/emulated/0/Pictures/IMG_20171108_180509.jpg)转为URI:content://media/external/images/media
private Uri getImageContentUri(String filePath) {
if (TextUtils.isEmpty(filePath)) {
return null;
}
Cursor cursor = App.getInstance().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ",
new String[]{filePath}, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
cursor.close();
return Uri.withAppendedPath(baseUri, "" + id);
} else {
if (!TextUtils.isEmpty(filePath)) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return App.getInstance().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
通过吊起相机进行拍照
// 这个注意权限问题
private void takePhoto() {
String SDState = Environment.getExternalStorageState();
if (SDState.equals(Environment.MEDIA_MOUNTED)) {
tempFile = getPhotoFile();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 指定调用相机拍照后照片的储存路径
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
startActivityForResult(intent, REQUEST_CODE_CAMERA);
} else {
Toast.makeText(this, "no SD card!", Toast.LENGTH_LONG).show();
}
}
// 获取拍照保存的路径
private File getPhotoFile() {
// String path =
Environment.getExternalStorageDirectory().getAbsolutePath();
File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");
String format = dateFormat.format(date);
return new File(file.getPath(), format + ".jpg");
}
通过打开相册进行选择图片
private void pickPhoto() {
// Intent intent = new Intent(Intent.ACTION_PICK, null);
// intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_CODE_PHOTO);
}
图片压缩方法
质量压缩方法
/**
* 质量压缩方法
*
* @param image
* @return
*/
private Bitmap compressImage(Bitmap image) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 100;
while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
baos.reset();// 重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%,把压缩后的数据存放到baos中
options -= 10;// 每次都减少10
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
return BitmapFactory.decodeStream(isBm, null, null);
}
//======================================
/**
* 图片压缩方法:(使用compress的方法)
* <p/>
* <br>
* <b>说明</b> 如果bitmap本身的大小小于maxSize,则不作处理
*
* @param bitmap 要压缩的图片
* @param maxSize 压缩后的大小,单位kb
*/
private Bitmap compress(Bitmap bitmap, double maxSize) {
// 将bitmap放至数组中,意在获得bitmap的大小(与实际读取的原文件要大)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 格式、质量、输出流
bitmap.compress(Bitmap.CompressFormat.PNG, 70, baos);
byte[] b = baos.toByteArray();
// 将字节换成KB
double mid = b.length / 1024;
// 获取bitmap大小 是允许最大大小的多少倍
double i = mid / maxSize;
// 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩
if (i > 1) {
// 缩放图片 此处用到平方根 将宽带和高度压缩掉对应的平方根倍
// (保持宽高不变,缩放后也达到了最大占用空间的大小)
// scale方法是下面的scale方法
bitmap = scale(bitmap, bitmap.getWidth() / Math.sqrt(i),
bitmap.getHeight() / Math.sqrt(i));
}
return bitmap;
}
图片缩放方法,缩放到指定的长和宽
/**
* 图片的缩放方法
*
* @param src :源图片资源
* @param newWidth :缩放后宽度
* @param newHeight :缩放后高度
*/
private Bitmap scale(Bitmap src, double newWidth, double newHeight) {
// 记录src的宽高
float width = src.getWidth();
float height = src.getHeight();
// 创建一个matrix容器
Matrix matrix = new Matrix();
// 计算缩放比例
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 开始缩放
matrix.postScale(scaleWidth, scaleHeight);
// 创建缩放后的图片
return Bitmap.createBitmap(src, 0, 0, (int) width, (int) height,
matrix, true);
}
按照比例进行压缩
/**
* 图片按比例大小压缩方法
*
* @param srcPath (根据路径获取图片并压缩)
* @return
*/
private Bitmap getOptimizedImage(String srcPath) {
// Log.d(TAG, "getOptimizedImage --> isInMainThread " + Utils.isInMainThread());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
// 开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
// 现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
float hh = 800;// 这里设置高度为800f
float ww = 480;// 这里设置宽度为480f
// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;// be=1表示不缩放
if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;// 设置缩放比例
// 重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
return compress(bitmap, 500L);// 压缩好比例大小后再进行质量压缩
}
注意:
在做图片压缩时尽量将压缩操作放在子线程进行处理,因为压缩过程比较耗时,可能会抛出ANR