zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android将图片转换存到数据库再从数据库读取转换成图片实现代码

Android转换数据库代码 实现 图片 读取 转换成
2023-06-13 09:15:12 时间

首先,我们要把图片存入到数据库中,首先要创建一个数据库,如下所示:

复制代码代码如下:


packagecom.android.test;

importjava.io.ByteArrayOutputStream;

importandroid.content.ContentResolver;
importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.CompressFormat;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.provider.BaseColumns;

publicclassPictureDatabaseextendsSQLiteOpenHelper{

   //数据库的字段
   publicstaticclassPictureColumnsimplementsBaseColumns{
       publicstaticfinalStringPICTURE="picture";
   }

   privateContextmContext;

   //数据库名
   privatestaticfinalStringDATABASE_NAME="picture.db";
   //数据库版本号
   privatestaticfinalintDATABASE_Version=1;
   //表名
   privatestaticfinalStringTABLE_NAME="picture";

   //创建数据库
   publicPictureDatabase(Contextcontext){
       super(context,DATABASE_NAME,null,DATABASE_Version);
       this.mContext=context;
   }

   //创建表并初始化表
   @Override
   publicvoidonCreate(SQLiteDatabasedb){
       Stringsql="Createtable"+TABLE_NAME+"("+BaseColumns._ID
       +"integerprimarykeyautoincrement,"+PictureColumns.PICTURE
       +"blobnotnull);";
       db.execSQL(sql);

       //初始化
       initDataBase(db,mContext);
   }

   //将转换后的图片存入到数据库中
   privatevoidinitDataBase(SQLiteDatabasedb,Contextcontext){
       Drawabledrawable=context.getResources().getDrawable(R.drawable.test_icon_resizer);
       ContentValuescv=newContentValues();
       cv.put(PictureColumns.PICTURE,getPicture(drawable));
       db.insert(TABLE_NAME,null,cv);
   }

   //将drawable转换成可以用来存储的byte[]类型
   privatebyte[]getPicture(Drawabledrawable){
       if(drawable==null){
           returnnull;
       }
       BitmapDrawablebd=(BitmapDrawable)drawable;
       Bitmapbitmap=bd.getBitmap();
       ByteArrayOutputStreamos=newByteArrayOutputStream();
       bitmap.compress(CompressFormat.PNG,100,os);
       returnos.toByteArray();
   }

   //更新数据库
   @Override
   publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
       Stringsql="DROPTABLEIFEXISTS"+TABLE_NAME;
       db.execSQL(sql);
       onCreate(db);
   }
}


代码注释的比较详细.

这里重点要说的是初始化数据库的时候,将Drawable转变成byte[]的时候,先讲Drawable转换成Bitmap,然后将Bitmap存入字节数据输出流,从输出流里获取byte[]数组。

复制代码代码如下:


ByteArrayOutputStreamos=newByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG,100,os);
returnos.toByteArray();

之后将字符数组存入到类型为blob的数据库中去。

复制代码代码如下:
ContentValuescv=newContentValues();
cv.put(PictureColumns.PICTURE,getPicture(drawable));
db.insert(TABLE_NAME,null,cv);

之后在代码中从数据库中取出byte[],然后转换成Drawable,设置图片即可。

代码如下:

复制代码代码如下:
packagecom.android.test;

importjava.util.ArrayList;

importandroid.app.Activity;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.os.Bundle;
importandroid.widget.ImageView;

publicclassTestPictureextendsActivity{

   @Override
   protectedvoidonCreate(BundlesavedInstanceState){
       super.onCreate(savedInstanceState);
       ImageViewiv=newImageView(this);
       if(getDrawable().size()!=0){
           iv.setImageDrawable(getDrawable().get(0));
       }
       setContentView(iv);
   }

   
   privateArrayList<Drawable>getDrawable(){
       PictureDatabasepd=newPictureDatabase(this);
       SQLiteDatabasesd=pd.getWritableDatabase();

       ArrayList<Drawable>drawables=newArrayList<Drawable>();

       //查询数据库
       Cursorc=sd.query("picture",null,null,null,null,null,null);

       //遍历数据
       if(c!=null&&c.getCount()!=0){
           while(c.moveToNext()){
               //获取数据
               byte[]b=c.getBlob(c.getColumnIndexOrThrow(PictureDatabase.PictureColumns.PICTURE));
               //将获取的数据转换成drawable
               Bitmapbitmap=BitmapFactory.decodeByteArray(b,0,b.length,null);
               BitmapDrawablebitmapDrawable=newBitmapDrawable(bitmap);
               Drawabledrawable=bitmapDrawable;
               drawables.add(drawable);
           }
       }
       returndrawables;
   }
}

重点注意如何将数据库中取出的byte[]转换成drawable:

复制代码代码如下:
Bitmapbitmap=BitmapFactory.decodeByteArray(b,0,b.length,null);
BitmapDrawablebitmapDrawable=newBitmapDrawable(bitmap);
Drawabledrawable=bitmapDrawable;

 

运行效果如下: