activity之间图片的传递与图片的保存(bitmap)sd卡
将网络图片保存到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卡上 专业的保存方法请见: 磁盘缓存-DiskLruCache
/* * 保存网络图片到内存卡 */ 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"/>
效果图: