最近在开发中,需要用到将图片保存到数据库中,然后再把数据库中的数据拿出来进行显示。后面查了下一些方法,主要这样的实现就有两种思路:
方法一:将图片解析为二进制的数据,然后放入到数据库中的一种BLOD类型中
方法二:保存图片的URL路径
方法三:其实还可以将图片存放到本地文件,那么就以后直接从本地文件进行获取就可以了,但是这就是需要注意下,就是要保证路径都是唯一的,这里可以用时间戳进行产生,或者用我上一篇的第18点中讲到的一些产生Token的方法。
比如上面的这两种思路都各有各的好处,所以我们也都需要看需求来进行选择,下面主要借鉴下别人的方法,来进行共享,资源的地址是 http://www.jb51.net/article/43765.htm。。。和http://bbs.csdn.net/topics/390191940 的感谢分享。
步骤如下:
一:创建数据库
package com.android.test;
import java.io.ByteArrayOutputStream;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.provider.BaseColumns;
public class PictureDatabase extends SQLiteOpenHelper {
//数据库的字段
public static class PictureColumns implements BaseColumns {
public static final String PICTURE = "picture";
}
private Context mContext;
//数据库名
private static final String DATABASE_NAME = "picture.db";
//数据库版本号
private static final int DATABASE_Version = 1;
//表名
private static final String TABLE_NAME = "picture";
//创建数据库
public PictureDatabase (Context context) {
super(context, DATABASE_NAME, null, DATABASE_Version);
this.mContext = context;
}
//创建表并初始化表
@Override
public void onCreate (SQLiteDatabase db) {
String sql = "Create table " + TABLE_NAME + "(" + BaseColumns._ID
+ " integer primary key autoincrement," + PictureColumns.PICTURE
+ " blob not null);";
db.execSQL(sql);
//初始化
initDataBase(db,mContext);
}
//将转换后的图片存入到数据库中
private void initDataBase (SQLiteDatabase db, Context context) {
Drawable drawable = context.getResources().getDrawable(R.drawable.test_icon_resizer);
ContentValues cv = new ContentValues();
cv.put(PictureColumns.PICTURE, getPicture(drawable));
db.insert(TABLE_NAME, null, cv);
}
//将drawable转换成可以用来存储的byte[]类型
private byte[] getPicture(Drawable drawable) {
if(drawable == null) {
return null;
}
BitmapDrawable bd = (BitmapDrawable) drawable;
Bitmap bitmap = bd.getBitmap();
ByteArrayOutputStream os = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 100, os);
return os.toByteArray();
}
//更新数据库
@Override
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {
String sql = " DROP TABLE IF EXISTS " + TABLE_NAME;
db.execSQL(sql);
onCreate(db);
}
}
二:代码注释的比较详细.这里重点要说的是初始化数据库的时候,将Drawable转变成byte[]的时候,先讲Drawable转换成Bitmap,然后将Bitmap存入字节数据输出流,从输出流里获取byte[]数组。
ByteArrayOutputStream os = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 100, os);
return os.toByteArray();
三:之后将字符数组存入到类型为blob的数据库中去
ContentValues cv = new ContentValues();
cv.put(PictureColumns.PICTURE, getPicture(drawable));
db.insert(TABLE_NAME, null, cv);
四:
之后在代码中从数据库中取出byte[],然后转换成Drawable,设置图片即可。
package com.android.test;
import java.util.ArrayList;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;
public class TestPicture extends Activity {
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ImageView iv = new ImageView(this);
if(getDrawable().size() != 0) {
iv.setImageDrawable(getDrawable().get(0));
}
setContentView(iv);
}
private ArrayList<Drawable> getDrawable() {
PictureDatabase pd = new PictureDatabase(this);
SQLiteDatabase sd = pd.getWritableDatabase();
ArrayList<Drawable> drawables = new ArrayList<Drawable>();
//查询数据库
Cursor c = 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
Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length, null);
BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
Drawable drawable = bitmapDrawable;
drawables.add(drawable);
}
}
return drawables;
}
}
五:
重点注意如何将数据库中取出的byte[]转换成drawable:
Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length, null);
BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
Drawable drawable = bitmapDrawable;
上面就是整个的关键步骤了,。。。效果图的话可以参考上面的分享链接进去看看。
我们都知道,在Android开发中,会遇到要请求服务器拿到图片的一种情况,这种情况又怎么进行处理,我主要就是整理了下面的一些简单方法。
其实总之就是,要得到图片的URL,而不是直接得到图片的一种方式(这样处理就可能存在URL改变了,那么图片就无法显示)。
如果需要这样做的话,可以参考下下面的代码。
// 传输网络图片
public Bitmap getPic(String uriPic) {
URL imageUrl = null;
Bitmap bitmap = null;
try {
imageUrl = new URL(uriPic);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) imageUrl
.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
再得到图片后,如果还想继续进行处理,那么就可以bmp = Bitmap.createScaledBitmap(bmp,长,宽,true);
好了,这大概就是这方面的内容了,其实还挺有用的。。。共同学习进步!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12450.html