» 首頁 » 討論區 » Android程式設計 »sqlite存放圖片

sqlite存放圖片

發表人: 訪客
發表時間: 2011-09-08 21:59:24
請問可以在sqlite裡放圖片,然後當照相鏡頭在某一處照到和此相同的圖之後,從sqlite抓取此圖相關的資料嗎?
發表人: Seachaos
積分: 2432
發表時間: 2011-09-09 09:36:31
你好:
可以
不過你要先編碼過
例如base64,或是二進位檔
發表人: 訪客
發表時間: 2011-09-09 20:51:46
請問是只要先把圖片轉成base64碼之後,再存入資料庫嗎?
發表人: Seachaos
積分: 2432
發表時間: 2011-09-10 20:41:39
是的
Binary -> base64
取回來的時候
Base64 ->Binary
這樣就可以了

或是你的SQLite是BLOB形態的話也可以直接存入Binary的Image
發表人: 訪客
發表時間: 2011-09-10 22:05:03
請問不知道是否有範例可以參考?>"<
已經先轉成base64碼了
但不知道如何抓取
發表人: Seachaos
積分: 2432
發表時間: 2011-09-11 21:08:43
以下是把Android的Bitmap轉成Base64並存入資料庫的方法

[sea:javaCode]
// 先把 bitmpa 轉成 byte
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream );
byte bytes[] = stream.toByteArray();
// Android 2.2以上才有內建Base64,其他要自已找Libary或是用Blob存入SQLite
String base64 = Base64.encodeToString(bytes, Base64.DEFAULT); // 把byte變成base64
[/sea]

再來是轉回來
[sea:javaCode]
// 把Base64變回bytes
bytes = Base64.decode(base64, Base64.DEFAULT);
bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); //用BitmapFactory生成bitmap
[/sea]
發表人: 訪客
發表時間: 2011-09-12 14:39:28
請問如果要用"攝像鏡頭抓取圖片",是否是要和"把圖片存入sqlite"的程式碼分為兩個ANDROID程式來寫?還是想在同一個檔就可以了?可以直接用手機內建的攝像鏡頭嗎?
發表人: Seachaos
積分: 2432
發表時間: 2011-09-13 11:10:31
您好:
這就是看你的設計了,因我不知道你的架構

另外可以再拍照後直接存入SQLite沒有問題,在Camera的Call back就可以取得bytes的bitmap
[sea:javaCode]
public PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
[/sea]
這邊的data直接就可以用base64或是BLOB的方式存入SQLite
發表人: 訪客
發表時間: 2011-09-14 03:17:28
您好,我也想在SQLite裡放入圖片!
因此我有以下兩個問題:
1.我想請問base64在SQLite中的type應該放什麼?
----------------------------------------
2.如果用blob的話,不知該怎麼轉變type能寫入跟讀取?
以下是我曾經試過的:
//轉成二進位
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.a);
ByteArrayOutputStream out = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
byte[] p_img = out.toByteArray();
//放p_img進去SQLite
ContentValues cv = new ContentValues();
cv.put("image", p_img);

然後在讀取那邊是這樣的:
//轉回來圖
byte[] blob = c1.getBlob(columnIndex);
Bitmap bmp = BitmapFactory.decodeByteArray(blob,0,blob.length);
//放入ListView
map.put("p_img", bmp); (這邊是ListView)
但是執行結果總是會在要去讀取的頁面那邊出錯,顯示沒有回應那樣...
請問是在哪邊出錯了呢?

麻煩您替我解惑了, 謝謝! :)
發表人: Seachaos
積分: 2432
發表時間: 2011-09-15 00:14:53
Base64是String或是Char (他是文字)

另外你取回會有錯誤的原因可能是你的columnIndex有問題
你可以用以下的方法取得正確的columnIndex
[sea:javaCode]
columnIndex = cursor.getColumnIndexOrThrow("image"); //看你的column name 是什麼
[/sea]
發表人: 訪客
發表時間: 2011-10-26 16:15:21
請問用BLOB形態把圖片存進資料庫裡
要如何讀取呢?
發表人: Seachaos
積分: 2432
發表時間: 2011-10-27 01:55:42
因為存進去的是Bytes
所以可以用
[sea:javaCode]
BitmapFactory.decodeByteArray(data, offset, length)
[/sea]
直接把Bytes轉回Bitmap
發表人: 訪客
發表時間: 2011-10-30 18:44:31
請問
BitmapFactory.decodeByteArray(data, offset, length)
後面三個是要放什麼?
發表人: Seachaos
積分: 2432
發表時間: 2011-10-31 01:56:29
data就是Bytes
offset是位元開始點,通常是0
length就是data的長度
發表人: 訪客
發表時間: 2011-11-01 23:36:36
你好,我先在main.xml設一個editText
當使用輸入"XXX"之後,會去資料庫抓取相對的圖片(以imageView呈現)

[sea:javaCode]
private Button.OnClickListener onClickBtnQuery = new Button.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub

Cursor c = null;

if (mEdtTeacher.getText().toString() == null == false) {
c = database.query(true, TABLE_FILENAME, new String[]{"teacher\n", "timeable\n"},
"teacher=" + "\"" + mEdtTeacher.getText().toString() + "\"",null, null, null, null, null);
}

if (c == null)
return;

if (c.getCount() == 0) {
mEdtTeacher.setText("");
Toast.makeText(findTeacher.this, "沒有這筆資料", Toast.LENGTH_LONG)
.show();
}
else {
c.moveToFirst();
mImage.setTag(c.getString(2));//取圖片

}
}
};
[/sea]

目前我寫的方式是這樣,不知哪裡有錯呢?
發表人: Seachaos
積分: 2432
發表時間: 2011-11-02 08:36:17
你好:
因我沒有你完整的資料結構,所以不太清楚你說的錯誤是?
是說無法顯示資料? 還是SQLite有問題?
發表人: 訪客
發表時間: 2011-11-02 15:44:04
你好,就是輸入文字串之後
不能顯示相對的圖片
發表人: 訪客
發表時間: 2011-11-02 15:54:38
請問是不是查詢的部分與輸出部分有問題?

[sea:javaCode]
if (mEdtTeacher.getText().toString() == null == false) {
c = database.query(true, TABLE_FILENAME, new String[]{"teacher\n", "timeable\n"},
"teacher=" + "\"" + mEdtTeacher.getText().toString() + "\"",null, null, null, null, null);
}
[/sea]

teacher是字串
timeable是放圖片


取圖片的部分
c.moveToFirst();
mImage.setTag(c.getString(2));//取圖片
發表人: 訪客
發表時間: 2011-11-03 22:27:31
你好,我可能搞錯BLOB裡面要放的值
所以想問一下BLOB裡面放的值應該是?
發表人: Seachaos
積分: 2432
發表時間: 2011-11-04 01:46:18
BOLB是Bytes
cursor.getBlob(columnIndex) 得到的就是Bytes
而Android的ImageView要設定圖片的話是用setImageBitmap之類的方法

要從SQLite中取出Bytes然後顯示的話可以參考以下程式碼
[sea:javaCode]
bytes = cursor.getBlob(columnIndex);
bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
imageView.setImageBitmap(bmp);
[/sea]