protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {// 选取图片的返回值
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
Cursor cursor = getContentResolver().query(uri, null, null,
null, null);
cursor.moveToFirst();// 指向查询结果的第一个位置
String imgPath1 = cursor.getString(1); // 图片文件路径
String imgSize = cursor.getString(2); // 图片大小
String imgName = cursor.getString(3); // 图片文件名
BitmapFactory.Options options = new BitmapFactory.Options();
// 此时把options.inJustDecodeBounds 设回true,即只读边不读内容
options.inJustDecodeBounds = true;
// 默认是Bitmap.Config.ARGB_8888
options.inPreferredConfig = Bitmap.Config.RGB_565;
try {
//此时不会把图片读入内存,只会获取图片宽高等信息
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(uri), null, options);
//上面一句和下面的类似
//Bitmap bitmap = BitmapFactory.decodeFile(imgPath,options);
int heitht = options.outHeight;
// 根据需要设置压缩比例
int size = heitht / 800;
if (size <= 0) {
size = 2;
}
/*inSampleSize表示缩略图大小为原始图片大小的几分之一,
即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,
图片大小就为原始大小的1/4*/
options.inSampleSize = size;
// 设置options.inJustDecodeBounds重新设置为false
options.inPurgeable = true;// 同时设置才会有效
options.inInputShareable = true;//。当系统内存不够时候图片自动被回收
options.inJustDecodeBounds = false;
//此时图片会按比例压缩后被载入内存中
bitmap = BitmapFactory.decodeStream(getContentResolver()
.openInputStream(uri), null, options);
SaveSD.saveBitmap(imgName,bitmap);//saveBitmap这个是我定义保存到SDcard中的方法
circleImageView.setImageBitmap(bitmap);
imgPath="/sdcard/"+imgName;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
public class SaveSD {
/**
* 保存图片到指定文件夹,将图片保存到本地时进行压缩, 即将图片从Bitmap形式变为File形式时进行压缩,
*
* @param imgName
* 图片名称 bitmap 处理图片对象
*
*
* */
public static void saveBitmap(String imgName, Bitmap bitmap) {
String sdpath = "/sdcard/";
File file = new File(sdpath, imgName);
if (file.exists()) {
file.delete();
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
/* options表示 如果不压缩是100,表示压缩率为0。如果是70,就表示压缩率是70,表示压缩30%; */
int options = 100;
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
while (baos.toByteArray().length / 1024 > 500) {
// 循环判断如果压缩后图片是否大于500kb继续压缩
baos.reset();
options -= 10;
// 这里压缩options%,把压缩后的数据存放到baos中
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
}
try {
FileOutputStream out = new FileOutputStream(file);
out.write(baos.toByteArray());
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
质量压缩2,将头像保存到sqlite数据库,
在实例中是是字节,就是将图片转化成字节存入数据库
public class Person implements Serializable{
private int id;
private String call;
private String name;
private String sexy;
private String age;
private byte[] image; .......
在看看创建数据库时,Image是
BLOB形式:
/**
* 数据库第一次创建时回调此方法. 初始化一些表
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// 操作数据库
String sql = "create table person(id integer primary key,call varchar(20), " +
"name varchar(20),sexy varchar(20),age varchar(20),image BLOB);";
db.execSQL(sql);
}
对bitmap进行质量压缩,并将bitmap转化成
字节形式
public class BitmapToByte {
/**
* 保存图片到指定文件夹,将图片保存到本地时进行压缩, 即将图片从Bitmap形式变为File形式时进行压缩,
*
* @param imgName
* 图片名称 bitmap 处理图片对象
*
*
* */
public static byte[] saveBitmap(Bitmap bitmap) {
int size=bitmap.getWidth()*bitmap.getHeight()*4;
//创建一个字节数组输出流,流的大小为size
ByteArrayOutputStream baos=new ByteArrayOutputStream(size);
//设置位图的压缩格式,质量为100%,并放入字节数组输出流中
int options = 100;
/* options表示 如果不压缩是100,表示压缩率为0。如果是70,就表示压缩率是70,表示压缩30%; */
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
while (baos.toByteArray().length / 1024 > 500) {
// 循环判断如果压缩后图片是否大于500kb继续压缩
baos.reset();
options -= 10;
// 这里压缩options%,把压缩后的数据存放到baos中
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
}
//将字节数组输出流转化为字节数组byte[]
byte[] imagedata=baos.toByteArray();
return imagedata;
}
}