• Android学习 之 Bitmap Drawable byte[] 三者之间的转换以及把数组存入数据库及提取数据重新组合成所需对象,如图像


    1.创建数据库表的时候选择存图片的字段类型为blob

    StringBuffer createTableOfHistory = new StringBuffer();
    createTableOfHistory.append("CREATE TABLE "+某表名);
    createTableOfHistory.append(" ( _id INTEGER PRIMARY KEY AUTOINCREMENT ,");
    createTableOfHistory.append(该存图片的字段名+" BLOB ,");
    createTableOfHistory.append(其他字段名1+" TEXT ,");
    
    .......
    
    createTableOfHistory.append(其他字段名n+" TEXT );");//记得这里带个“;”封号
    db.execSQL(createTableOfHistory.toString());//执行该创表语句
    

    2.存储数据

      2.1将数据流转成数组的方法

     InputStream inputStream = getResources().openRawResource(R.drawable.icon);
    
      private static byte[] streamToBytes(InputStream is) {
            ByteArrayOutputStream os = new ByteArrayOutputStream(1024);
            byte[] buffer = new byte[1024];
            int len;
            try {
                while ((len = is.read(buffer)) >= 0) {
                    os.write(buffer, 0, len);
                }
            } catch (java.io.IOException e) {
            }
            return os.toByteArray();
      }
    

    2.2.将Bitmap对象转换成数组的方法【包含从资源文件中获得图片对象Bitmap】

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
    
      private static byte[] bitmapToBytes(Bitmap bitmap){
      if (bitmap == null) {
         return null;
      }
      final ByteArrayOutputStream os = new ByteArrayOutputStream();
      // 将Bitmap压缩成PNG编码,质量为100%存储
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);//除了PNG还有很多常见格式,如jpeg等。
      return os.toByteArray();
     }
    
     
    
      ContentValues values = new ContentValues();
      values.put(该存图片的字段名, readHistoryInfo.getBookIcon());
      values.put(其他字段名1, “2011-05-17”);
    
      ......
    
      return mSqliteDatabase.insert(表名, null, values);//插入数据
    

    3.提取数据库中的数组数据并转换成Bitmap或DrawableBitmap对象【包含byte[] —> Bitmap】

    某类对象m(该类是负责创表,删表,插入数据,删除数据的类).openOrCreateDB();//openOrCreateDB()也是该类的一个打开或创建数据库的方法。

    Cursor cursor = 某类对象m.getData(该存图片的字段名, null);
    if (cursor.moveToFirst()) {
    
       // byte[] —> Bitmap
       byte[] bytes = cursor.getBlob(cursor.getColumnIndex(该存图片的字段名));
       Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, null);
       BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
    
    }
    

    4.Drawable —> Bitmap

    Bitmap bm = xxx; //xxx根据你的情况获取
      BitmapDrawable bd= new BitmapDrawable(bm); 
    
      提示:因为BtimapDrawable是Drawable的子类,最终直接使用bd对象即可。
    
    public static Bitmap drawableToBitmap(Drawable drawable) {
             
            Bitmap bitmap = Bitmap.createBitmap(
                                       drawable.getIntrinsicWidth(),
                                       drawable.getIntrinsicHeight(),
                                       drawable.getOpacity() != PixelFormat.OPAQUE ? 
    
                                       Bitmap.Config.ARGB_8888: Bitmap.Config.RGB_565);
            return bitmap;
      }
    
      Drawable d=xxx; //xxx根据自己的情况获取drawable
      BitmapDrawable bd = (BitmapDrawable) d;
      Bitmap bm = bd.getBitmap(); 
    



  • 相关阅读:
    SQL性能优化:如何定位网络性能问题
    ORACLE 10升级到10.2.0.5 Patch Set遇到的内核参数检测失败问题
    Linux 僵尸进程查杀
    Linux 虚拟机网络适配器从E1000改为VMXNET3
    v$session中server为none与shared值解析
    SQL SERVER导出特殊格式的平面文件
    XtraBackup出现 Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    CentOS 6.6安装Xtrabackup RPM提示缺少libev.so.4()
    SQL Server Replication 中关于视图的点滴
    ORA-00988: missing or invalid password(s)
  • 原文地址:https://www.cnblogs.com/enricozhang/p/2195601.html
Copyright © 2020-2023  润新知