Android从SD卡读取图片并显示

之前做一个项目的时候需要1.从SD卡读取图片转为预览图(点阵图,类似马赛克),2.保存当前预览图到特定文件夹,保存为一个txt,txt里存的是像素矩阵。3.从那个特定文件夹里读取像素矩阵,显示为预览图。

今天一下午和一晚上都在纠结第3个任务。终于搞定了。

bmp=Bitmap.createBitmap(Bitmap2, width*size, height*size, Bitmap.Config.ARGB_8888);

第4个参数..蛋疼,之前写成bmp.getConfig(),一运行就意外停止。这个函数的作用就是把像素矩阵转为bitmap,之后在imageView中显示。

Android从SD卡读取图片并显示为点阵图

Android从SD卡读取图片并显示为点阵图

Android从SD卡读取图片并显示为点阵图

Android从SD卡读取图片并显示为点阵图

Android从SD卡读取图片并显示为点阵图

Android从SD卡读取图片并显示为点阵图

Android从SD卡读取图片并显示为点阵图


Android从SD卡读取图片并显示为点阵图


Activity01Activity.java :

 

package zhang.zhuoyueBei.SDCardFileExplorerAndFileToBitMap;

import zhang.zhuoyueBei.SDCardFileExplorerAndFileToBitMap.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Activity01Activity extends Activity {
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
       
       
       
        Button button3=(Button) findViewById(R.id.button3);
        button3.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v)
   {
    
    Intent intent = new Intent();
    
    intent.setClass(Activity01Activity.this, FileToBitMapActivity.class);
    
    startActivity(intent);
    
    Activity01Activity.this.finish();
   }
        });
    }
   
   
    @Override
    public void onStart()
 {
  super.onStart();
 }
    @Override
 public void onResume()
 {
  super.onResume();
 }
    @Override
 public void onPause()
 {
  super.onPause();
 }
    @Override
 public void onStop()
 {
  super.onStop();
 }
    @Override
 public void onDestroy()
 {
  super.onDestroy();
 }
    @Override
 public void onRestart()
 {
  super.onRestart();
 }
   
   
}

 

 

 

FileToBitMapActivity.java :

 

 

package zhang.zhuoyueBei.SDCardFileExplorerAndFileToBitMap;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import zhang.zhuoyueBei.SDCardFileExplorerAndFileToBitMap.R;


import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.graphics.Matrix;
public class FileToBitMapActivity extends Activity
{
 String SDcardPath;
 String FolderPath;
 
 String filePath;
 int state=0;//0 没参数,1 取得imagepath,2取得资源文件path
 
 int width=16;
 int height;
 
    int initWidth;
    int initHeight;

 
    Bitmap bmp;
   
    int[] Bitmap1;//缩放后16行的像素矩阵
   
    int size=20;//1格点阵的边长
    int[] Bitmap2;//缩略图
    String res=null;
   
    ImageView mImageView;
   
   

   
    public String getSDPath(){
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState()  
                            .equals(android.os.Environment.MEDIA_MOUNTED);   //判断sd卡是否存在
        if   (sdCardExist)  
                                    
          sdDir = Environment.getExternalStorageDirectory();//获取根目录
       
        return sdDir.toString();
       
 }
   
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.filetobitmap);
  
  SDcardPath=getSDPath();
  FolderPath=SDcardPath+"/MagicSwing";
  
  Bundle bundle= new Bundle();
  bundle=this.getIntent().getExtras();
  if(bundle!=null){
  filePath=bundle.getString("filePath");
  state=bundle.getInt("state");
  if(state==1){
   
      Bitmap   image = BitmapFactory.decodeFile(filePath);
      initWidth = image.getWidth();
      initHeight = image.getHeight();
      float scale=((float)width)/initWidth;
      height=(int)(initHeight*scale);
        
         //将image缩放后存在bmp中
         Matrix matrix=new Matrix();
         //缩放矩阵
         matrix.postScale(scale,scale);
         //缩放
   bmp=Bitmap.createBitmap(image,0,0,initWidth,initHeight,matrix,true);
        
   //得到缩放后的像素矩阵
   Bitmap1=new int[width*height];
   bmp.getPixels(Bitmap1,0,width,0,0,width,height);
  }
  
  else if(state==2)
  {
    File file = new File(FolderPath+"/res.txt");
   if(file.exists()) 
   {
       try{
        FileInputStream fi = new FileInputStream(FolderPath+"/res.txt"); 
        BufferedReader br = new BufferedReader(new InputStreamReader(fi)); 


        String readString = new String(); 

            while ((readString = br.readLine()) != null) { 

                  //数据多的话须要在这里处理 readString 
           res+=readString;

           

       }catch (Exception e)
       {
       }
   
   
   if(res!=null){
    res=res.substring(5);
    int len=0;
    int cur=0;
    int num=1;
    for(int i=0;i<res.length();i++)
     if(res.charAt(i)==' ')
      num++;
    Bitmap1=new int[num];
    String tmp=new String();
    for(int i=0;i<res.length();i++){
     while(i<res.length()&&res.charAt(i)!=' ')
     {
      i++;
      len++;
     }
     tmp=res.substring(i-len,i);
     
     Bitmap1[cur++]=Integer.parseInt(tmp);
     len=0;
    }
    height=cur/width; 

  }
  }
   Bitmap2=new int[width*height*size*size];   
   
   res=new String();
   for(int i=0;i<width;i++)
    for(int j=0;j<height;j++)
    {
        int RGB=Bitmap1[i+j*width];
        for(int ii=i*size;ii<(i+1)*size;ii++)
         for(int jj=j*size;jj<(j+1)*size;jj++)
          Bitmap2[ii+jj*width*size]=RGB;

    }
   res="";
   for(int i=0;i<height;i++){
    
    for(int j=0;j<width;j++)
    {
     int RGB=Bitmap1[j+i*width];
        res+=" "+RGB;
    }
   }
    
  


           //这一句出错
   //bmp=Bitmap.createBitmap(Bitmap2, width*size, height*size, bmp.getConfig());
   bmp=Bitmap.createBitmap(Bitmap2, width*size, height*size, Bitmap.Config.ARGB_8888);
   
   mImageView=(ImageView)findViewById(R.id.imageView1);
   mImageView.setImageBitmap(bmp);
   
   //Canvas canvas=new Canvas();
   //canvas.drawBitmap(Bitmap2, 0, width*size, 0, 0, width*size, height*size, false, null);
    
   
   
  }

  
  
   Button button5=(Button) findViewById(R.id.imageImport);
         button5.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v)
    {
     
     Intent intent = new Intent();
     
     intent.setClass(FileToBitMapActivity.this, SDCardFileExplorerActivity.class);
     Bundle bundle=new Bundle();
     bundle.putBoolean("imageORresfile",true);
     intent.putExtras(bundle);
     
     
     startActivity(intent);
     
     FileToBitMapActivity.this.finish();
    }
         });
        
         Button button6=(Button) findViewById(R.id.resFileImport);
         button6.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v)
    {
     
     Intent intent = new Intent();
     
     
     intent.setClass(FileToBitMapActivity.this, SDCardFileExplorerActivity.class);
     
     
     Bundle bundle=new Bundle();
     bundle.putBoolean("imageORresfile",false);
     intent.putExtras(bundle);
     
     startActivity(intent);
     
     FileToBitMapActivity.this.finish();
    }
         });
        
         Button button7=(Button) findViewById(R.id.save);
         button7.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v)
    {
     
     FileOutputStream stream = null;
     try{
      File file = new File(FolderPath, "res.txt");
      if(!file.exists())
       file.createNewFile();
      stream = new FileOutputStream(file);

     }catch( FileNotFoundException e){
      
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }


     try{
      stream.write( res.getBytes() );
     }catch( IOException e ){
     }

     try{
      stream.close();
     }catch( IOException e ){
      
     }
     
    }
         });
        
        
         Button button8=(Button) findViewById(R.id.done);
         button8.setOnClickListener(new Button.OnClickListener() {
    public void onClick(View v)
    {
            
    }
         });
    }
   
   
    @Override
    public void onStart()
 {
  super.onStart();
 }
    @Override
 public void onResume()
 {
  super.onResume();
 }
    @Override
 public void onPause()
 {
  super.onPause();
 }
    @Override
 public void onStop()
 {
  super.onStop();
 }
    @Override
 public void onDestroy()
 {
  super.onDestroy();
 }
    @Override
 public void onRestart()
 {
  super.onRestart();
 }
 

}
 

 

SDCardFileExplorerActivity.java :

 

package zhang.zhuoyueBei.SDCardFileExplorerAndFileToBitMap;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import zhang.zhuoyueBei.SDCardFileExplorerAndFileToBitMap.R;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class SDCardFileExplorerActivity extends Activity {

 private TextView tvpath;
 private ListView lvFiles;
 private Button btnParent;
   
 Boolean imageORresfile;
 // 记录当前的父文件夹
 File currentParent;

 // 记录当前路径下的所有文件夹的文件数组
 File[] currentFiles;
   
 String SDCardPath;
 String folderPath; 
 
 public String getSDPath(){
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState()  
                            .equals(android.os.Environment.MEDIA_MOUNTED);   //判断sd卡是否存在
        if   (sdCardExist)  
                                    
          sdDir = Environment.getExternalStorageDirectory();//获取根目录
       
        return sdDir.toString();
       
 }
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.sdcardfileexplorer);
  
  
  Bundle bundle= new Bundle();
  bundle=this.getIntent().getExtras();
  if(bundle!=null){
   imageORresfile=bundle.getBoolean("imageORresfile");
  }

  lvFiles = (ListView) this.findViewById(R.id.files);

  tvpath = (TextView) this.findViewById(R.id.tvpath);
  btnParent = (Button) this.findViewById(R.id.btnParent);

  SDCardPath=getSDPath();
  folderPath=SDCardPath+"/MagicSwing";
  
  
  // 获取系统的SDCard的目录
  File root = new File(SDCardPath);
  
  // 如果SD卡存在的话
  if (root.exists()) {
           
   if(imageORresfile){
   currentParent = root;
   currentFiles = root.listFiles();
   }
   else
   {
    currentParent =new File(folderPath);
    currentFiles= currentParent.listFiles();
   }
   // 使用当前目录下的全部文件、文件夹来填充ListView
   inflateListView(currentFiles);
           
  }

  lvFiles.setOnItemClickListener(new OnItemClickListener() {
   @Override
   public void onItemClick(AdapterView<?> adapterView, View view,
     int position, long id) {
    // 如果用户单击了文件,直接返回,不做任何处理
    if (currentFiles[position].isFile()) {
     // 也可自定义扩展打开这个文件等
     String name=currentFiles[position].getName();
     int i;
     for(i=0;i<name.length();i++)
      if(name.charAt(i)=='.')
       break;
     String suffix;
     suffix=String.valueOf(name.toCharArray(), i+1, name.length()-i-1); 
     if(((suffix.equals("jpg")||suffix.equals("bmp")||suffix.equals("jpeg")||suffix.equals("png"))&&imageORresfile)||(suffix.equals("txt")&&!imageORresfile)) {
      String imagePath=new String();
      try {
       imagePath = currentParent.getCanonicalPath()+"/"+name;
      } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      
      
      Intent intent=new Intent();
      intent.setClass(SDCardFileExplorerActivity.this,FileToBitMapActivity.class);
      Bundle bundle=new Bundle();
      bundle.putString("filePath", imagePath);
      if(!suffix.equals("txt"))
      bundle.putInt("state",1);
      else
       bundle.putInt("state",2);
      intent.putExtras(bundle);
      startActivity(intent);
      SDCardFileExplorerActivity.this.finish();
     }
     else
      Toast.makeText(SDCardFileExplorerActivity.this,
        "不支持的格式", Toast.LENGTH_LONG).show();
     
     
     return;
    }

    // 获取用户点击的文件夹 下的所有文件
    File[] tem = currentFiles[position].listFiles();
    if (tem == null || tem.length == 0) {

     Toast.makeText(SDCardFileExplorerActivity.this,
       "当前路径不可访问或者该路径下没有文件", Toast.LENGTH_LONG).show();
    } else {
     // 获取用户单击的列表项对应的文件夹,设为当前的父文件夹
     currentParent = currentFiles[position];
     // 保存当前的父文件夹内的全部文件和文件夹
     currentFiles = tem;
     // 再次更新ListView
     inflateListView(currentFiles);
    }

   }
  });

  // 获取上一级目录
  btnParent.setOnClickListener(new View.OnClickListener() {

   @Override
   public void onClick(View v) {

    try {

     if (!currentParent.getCanonicalPath().equals(SDCardPath)) {
                       
      
      // 获取上一级目录
      currentParent = currentParent.getParentFile();
      // 列出当前目录下的所有文件
      currentFiles = currentParent.listFiles();
      // 再次更新ListView
      inflateListView(currentFiles);
     }
    } catch (Exception e) {
     // TODO: handle exception
    }

   }
  });

 }

 
 private void inflateListView(File[] files) {

  List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();

  for (int i = 0; i < files.length; i++) {

   Map<String, Object> listItem = new HashMap<String, Object>();

   if (files[i].isDirectory()) {
    // 如果是文件夹就显示的图片为文件夹的图片
    listItem.put("icon", R.drawable.folder);
   } else {
    listItem.put("icon", R.drawable.file);
   }
   // 添加一个文件名称
   listItem.put("filename", files[i].getName());

   File myFile = new File(files[i].getName());

   // 获取文件的最后修改日期
   long modTime = myFile.lastModified();
   SimpleDateFormat dateFormat = new SimpleDateFormat(
     "yyyy-MM-dd HH:mm:ss");
   System.out.println(dateFormat.format(new Date(modTime)));

   // 添加一个最后修改日期
   listItem.put("modify",
     "修改日期:" + dateFormat.format(new Date(modTime)));

   listItems.add(listItem);

  }

  // 定义一个SimpleAdapter
  SimpleAdapter adapter = new SimpleAdapter(
    SDCardFileExplorerActivity.this, listItems, R.layout.list_item,
    new String[] { "filename", "icon", "modify" }, new int[] {
      R.id.file_name, R.id.icon, R.id.file_modify });

  // 填充数据集
  lvFiles.setAdapter(adapter);

  try {
   tvpath.setText("当前路径为:" + currentParent.getCanonicalPath());
  } catch (Exception e) {
   e.printStackTrace();
  }

 }
 
 
 
 
    @Override
    public void onStart()
 {
  super.onStart();
 }
    @Override
 public void onResume()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值