将网络图片保存到sd卡,再从sd卡取出bitmap图片的步骤:(保存到sd卡才是永久性的)
InputStream is = conn.getInputStream(); //第一步:将网络图片转换成bitmap
bitmap = BitmapFactory.decodeStream(is); bitmap.compress(CompressFormat.JPEG, 100, fos); //(FileOutputStream)第二步:将bitmap图片保存到fos流指定的文件中,100代表图片的清晰度,100代表原质量
Bitmap bitmap = BitmapFactory.decodeFile(savePath);//第三步:根据图片在啊sd卡上的路径而得到这个图片
假设有两个Activity,需要将第一个activity的图片传到第二个activity
前两种为传递Bitmap图片,要是知道资源id(该图片在工程里)就没必要这样传了,直接把id传过去就行(见第三种方法)
一、图片较小的情况(图片小于40K)
第一个activity:
Intent intent = new Intent(this, MainActivity2.class);
// 将图片解码为bitmap bitmap.getByteCount()可以获取字节大小
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
// Bitmap implements了 Parcelable,所以可以传递对象数据
intent.putExtra("bitmap", bitmap);//但是当传过去的图片大于40k就容易出错 1k=1024字节
startActivity(intent);
第二个activity:接收上面传来的图片
ImageView img = (ImageView) findViewById(R.id.imageView2);
Intent intent = getIntent();
Bitmap bitmap = intent.getParcelableExtra("bitmap");//获取序列化了的图片
img.setImageBitmap(bitmap);//类似设置src属性
二、当图片稍大,大于40K时,用第一种方法就容易死机了,要用下面的方法
第一个activity:
Intent intent = new Intent(this, MainActivity2.class);
// 将图片解码为bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.image1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 将图片压缩到字节流中 参数2:0-100。0意味着压缩体积小,100意味着压缩为马克斯质量。一些格式,比如PNG是无损的,将忽略质量设置,保险起见传JPNG好
bitmap.compress(Bitmap.CompressFormat.JPNG, 100, baos);
byte[] bitmapByte = baos.toByteArray();
intent.putExtra("bitmap", bitmapByte);// 发送字节流
startActivity(intent);
第二个activity:接收上面传来的图片
Intent intent = getIntent();
ImageView img=(ImageView) findViewById(R.id.imageView2);//布局中的图片,将传过来的图片设置到这个imageView上
//获取传过来的字节数组
byte[] bitmapByte = intent.getByteArrayExtra("bitmap");
//解码字节数组为bitmap位图
Bitmap bitmap=BitmapFactory.decodeByteArray(bitmapByte, 0, bitmapByte.length, null);
img.setImageBitmap(bitmap);//类似设置src属性
这两个方法的区别在于,第二种先把bitmap存储为byte数组,然后再通过Intent传递。
第三种:把图片的资源id传过去:
Intent intent = new Intent(this, MainActivity2.class);
intent.putExtra("bitmap", R.drawable.image1);
startActivity(intent);
接收:
ImageView img = (ImageView) findViewById(R.id.imageView2);
Intent intent = getIntent();
int id = intent.getIntExtra("bitmap", 0);
img.setImageResource(id);
图片的保存: 下载网络上的图片保存到sd卡上
/*
* 保存网络图片到内存卡
*/
public class MainActivity extends Activity {
private String imgNet="http://imgs.focus.cn/upload/hs/6421/b_64203012.jpg";
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img=(ImageView) findViewById(R.id.img);
new DownloadImgAsyncetask(this).execute(imgNet);
}
//测试的方法
public void testMethod(){
Bitmap bitmap=Utils.getBitmapToSd(imgNet);
img.setImageBitmap(bitmap);
}
}
/**
* 下载图片的异步任务
*/
class DownloadImgAsyncetask extends AsyncTask<String, Void, Bitmap>{
private Context context;
private String imgNet;
public DownloadImgAsyncetask(Context context) {
this.context = context;
}
@Override
protected Bitmap doInBackground(String... params) {
this.imgNet = params[0];//将图片地址记录下来
Bitmap bitmap = Utils.downloadImgToBitmap(params[0]);//下载图片
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
if(result!=null){
//保存bitmap到sd卡
Utils.saveBitmapToSd(result,imgNet);
//这里保存后直接调用测试方法
((MainActivity) context).testMethod();
}else{
Toast.makeText(context, "网络出错", 0).show();
}
}
}
Utils.java
public class Utils {
/**
* 下载图片为bitmap格式
*/
public static Bitmap downloadImgToBitmap(String net){
try {
HttpClient httpClient = new DefaultHttpClient();
System.out.println("11");
HttpGet get=new HttpGet(net);
System.out.println("22");
HttpResponse response = httpClient.execute(get);
System.out.println("33");
int code = response.getStatusLine().getStatusCode();
if(code==200){
Bitmap bitmap = BitmapFactory.decodeStream(response.getEntity().getContent());
return bitmap;
}else{
System.out.println("网络连接出错");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 保存bitmap图片到sd卡
* @param bitmap 得到的bitmap
* @param imageNetPath 图片的网址
*/
public static void saveBitmapToSd(Bitmap bitmap,String imageNetPath){
try {
//得到图片网址的后面部分做为图片的名字
String imgName=imageNetPath.substring(imageNetPath.lastIndexOf("/")+1);
//保存的路径
String savePath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+imgName;
FileOutputStream fos = new FileOutputStream(savePath);
//将图片压缩到一个流中
//CompressFormat format, 表示图片格式
//int quality, 表示压缩质量, 100表示原质量压缩
//OutputStream stream 表示bitmap需要压缩到那个输出流中
bitmap.compress(CompressFormat.JPEG, 100, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 根据图片的网络地址到sd卡上去获取btmap位图
*/
public static Bitmap getBitmapToSd(String imageNetPath){
//得到图片网址的后面部分做为图片的名字
String imgName=imageNetPath.substring(imageNetPath.lastIndexOf("/")+1);
//保存的路径
String savePath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+imgName;
Bitmap bitmap = BitmapFactory.decodeFile(savePath);
return bitmap;
}
}
权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
效果图: