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"/>

效果图:

 

posted @ 2016-08-06 20:59  ts-android  阅读(483)  评论(0编辑  收藏  举报