您的位置:首页 > 其它

图片压缩

2016-07-25 14:42 357 查看

1.MainActivity

public class MainActivity extends Activity {

private ImageView iv;
String imgPath = "http://guaju.github.io/flower2.jpg";

@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);

// 下载图片的方法
String localPath = downLoadImg(imgPath);
//压缩图片:两个东西:一个是option选项,decodeFile方法
/*
* 1.拿到图片分辨率
* ①:得到一个option
* ②:设置option的一个取值方式:只测量
* ③:把option和图片关联(也就是说测量了一下)
* ④: 取出图片宽高(这就是分辨率)
*
*/
Options options = new BitmapFactory.Options();
options.inJustDecodeBounds=true;//只是测量一下边界,意思是只看一下图片的大小,不看内容(节省了空间和时间)
BitmapFactory.decodeFile(localPath, options);
float outWidth = options.outWidth;
float outHeight = options.outHeight;
System.out.println("宽是"+outWidth+"高是"+outHeight);

/*2.计算压缩比例
*  一般是走480*800
*  或者获得自己屏幕宽高然后计算 
*  ①设定比例,如果实际照片宽大,那么就计算成宽的比例,反之亦然
*  ②设置option的压缩比例,并且设置option的压缩方式
*  ③关联bitmapfactoty去压缩图片
*/
int scale=1;//压缩比例 ,1表示不做缩放
//获取屏幕的分辨率
WindowManager wm = getWindowManager();
Display display = wm.getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();

float actWidth=display.getWidth();
float actHeight=display.getHeight();
//判断
if (outWidth>=outHeight&&outWidth>actWidth) {
scale=(int) (outWidth/actWidth);
}
else if(outHeight>outWidth&&outHeight>actHeight){
scale=(int) (outHeight/actHeight);
}
else {
scale=1;
}
//按照什么比例压缩
options.inSampleSize=scale;
//把option的测量方式改成---读取图片信息。
options.inJustDecodeBounds=false;
Bitmap bitmap = BitmapFactory.decodeFile(localPath, options);
iv.setImageBitmap(bitmap);
}
private String downLoadImg(final String path) {
new MyAsyncTask() {
private ProgressDialog progressDialog;
private HttpURLConnection conn;
@Override
public void preLoad() {
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.show();
}
@Override
public void loading() {
try {
URL url = new URL(path);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if (code == 200) {
runOnUiThread(new Runnable() {
public void run() {
try {
InputStream inputStream = conn.getInputStream();
// 输出流
FileOutputStream openFileOutput = openFileOutput("hua.jpg", MODE_PRIVATE);
byte[] buf = new byte[1024];
int temp = 0;
while ((temp = inputStream.read(buf)) != -1) {
openFileOutput.write(buf, 0, temp);
}
inputStream.close();
openFileOutput.close();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Toast.makeText(MainActivity.this, "成功加载图片", 1).show();
}
});
} else {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(MainActivity.this, "网络异常", 1).show();
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void afterLoad() {
progressDialog.dismiss();
}
}.exe();
return getFilesDir().getAbsolutePath()+"/hua.jpg";
}

}

2.MyAsyncTask(异步加载)

public abstract class MyAsyncTask {
//定义三个抽象方法
public abstract  void preLoad();
public abstract  void loading();
public abstract  void afterLoad();

//创建一个handler
public  Handler mHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
afterLoad();
};
};

//安排顺序
public  void exe(){
preLoad();
new Thread(new Runnable() {
@Override
public void run() {
loading();
//发消息
mHandler.sendEmptyMessage(0);
}
}).start();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: