android將圖片保存進數(shù)據(jù)庫

最近有朋友項目需要保存圖片到本地數(shù)據(jù)庫焰薄,問我怎么做,剛好我之前接觸過跟压,其實就是簡單的base64編碼轉換胰蝠,下面介紹超詳細超簡單demo:
首先放圖,no圖no bb:


效果圖.png

第一步:創(chuàng)建工程,然后更改main.xml樣式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/ivShow"
        android:layout_width="match_parent"
        android:layout_height="200dp" />
    <!--建議使用nestedscrollview,解決滑動沖突-->
    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="200dp">
        <!--由于base64編碼巨多茸塞,所以加個NestedScrollView加以滑動-->
        <TextView
            android:id="@+id/tvCode"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </android.support.v4.widget.NestedScrollView>

    <Button
        android:id="@+id/transferToBase"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="transfer"
        android:text="將圖片轉換成base64" />

    <Button
        android:id="@+id/transferToBitmap"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="transfer"
        android:text="將base64轉換成圖片" />
</LinearLayout>

然后創(chuàng)建assest folder:


創(chuàng)建assest目錄.png

創(chuàng)建之后將圖片放入(其實也可以放入drawable目錄,這里使用assest目錄):


assest目錄圖片.png

放入圖片之后就可以開始寫主程序:
package wiz.com.imagebase64demo;

import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {
    private ImageView mImageView;
    private TextView mTextView;
    private AssetManager mAssetManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    /**
     * 初始化view
     */
    private void initView() {
        mImageView = findViewById(R.id.ivShow);
        mTextView = findViewById(R.id.tvCode);
    }

    /**
     * 這是在xml定義了transfer的onclick事件
     *
     * @param view
     */
    public void transfer(View view) {
        switch (view.getId()) {
            case R.id.transferToBase:
                mTextView.setText(imageToBase64(getAssestResource()));
                break;
            case R.id.transferToBitmap:
                Bitmap bitmap = base64ToImage(mTextView.getText().toString());
                mImageView.setImageBitmap(bitmap);
                break;
        }
    }

    /**
     * 獲取assest目錄下的圖片資源
     *
     * @return
     */
    private Bitmap getAssestResource() {
        mAssetManager = getAssets();
        InputStream inputStream = null;
        try {
            //將其打開轉換成數(shù)據(jù)流
            inputStream = mAssetManager.open("banner_img.png");
            //利用BitmapFactory將數(shù)據(jù)流進行轉換成bitmap
            return BitmapFactory.decodeStream(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            //最后別忘了關閉數(shù)據(jù)流
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 將bitmap轉換成byte,該過程時間較長,建議子線程運行,但是這里我為了setText躲庄,就放主線程了
     *
     * @param bitmap
     * @return
     */
    private String imageToBase64(Bitmap bitmap) {
        //以防解析錯誤之后bitmap為null
        if (bitmap == null)
            return "解析異常";
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        //此步驟為將bitmap進行壓縮,我選擇了原格式png钾虐,第二個參數(shù)為壓縮質量读跷,我選擇了原畫質,也就是100禾唁,第三個參數(shù)傳入outputstream去寫入壓縮后的數(shù)據(jù)
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
        try {
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //將獲取到的outputstream轉換成byte數(shù)組
        byte[] bytes = outputStream.toByteArray();
        //android.util包下有Base64工具類效览,直接調用,格式選擇Base64.DEFAULT即可
        String str = Base64.encodeToString(bytes, Base64.DEFAULT);
        //打印數(shù)據(jù)荡短,下面計算用
        Log.i("MyLog", "imageToBase64: " + str.length());
        return str;
    }

    /**
     * 將base64轉成bitmap丐枉,該過程速度很快
     *
     * @param text
     * @return
     */
    private Bitmap base64ToImage(String text) {
        //同樣的,用base64.decode解析編碼掘托,格式跟上面一致
        byte[] bytes = Base64.decode(text, Base64.DEFAULT);
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }
}

這里附上drawable目錄獲取bitmap方法:

Bitmap myLogo = BitmapFactory.decodeResource(context.getResources(), R.drawable.banner_img);

效果動態(tài)圖.gif

最后讓我們做個計算:
可以看到動態(tài)圖瘦锹,有點模糊,打印出來的byte length長度是1664161byte闪盔,然后除兩次1024,變成1.59M左右弯院,原圖是1.2M,至于為什么會變大泪掀,可以參考這篇文章:https://blog.csdn.net/sallay/article/details/3550740
到這里你應該就明白了听绳,存進數(shù)據(jù)庫只需要把base64存進去就可以了,文章到這里結束异赫,有后續(xù)問題我會追加椅挣。
附Demo下載鏈接:
鏈接:https://pan.baidu.com/s/1E6QStQ1dyn5HzkCQS98k0A 密碼:kgsl

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市塔拳,隨后出現(xiàn)的幾起案子鼠证,更是在濱河造成了極大的恐慌,老刑警劉巖靠抑,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量九,死亡現(xiàn)場離奇詭異,居然都是意外死亡颂碧,警方通過查閱死者的電腦和手機荠列,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稚伍,“玉大人弯予,你說我怎么就攤上這事「鍪铮” “怎么了锈嫩?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵受楼,是天一觀的道長。 經常有香客問我呼寸,道長艳汽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任对雪,我火速辦了婚禮河狐,結果婚禮上,老公的妹妹穿的比我還像新娘瑟捣。我一直安慰自己馋艺,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布迈套。 她就那樣靜靜地躺著捐祠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桑李。 梳的紋絲不亂的頭發(fā)上踱蛀,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音贵白,去河邊找鬼率拒。 笑死,一個胖子當著我的面吹牛禁荒,可吹牛的內容都是我干的猬膨。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼圈浇,長吁一口氣:“原來是場噩夢啊……” “哼寥掐!你這毒婦竟也來了?” 一聲冷哼從身側響起磷蜀,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎百炬,沒想到半個月后褐隆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡剖踊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年庶弃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片德澈。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡歇攻,死狀恐怖,靈堂內的尸體忽然破棺而出梆造,到底是詐尸還是另有隱情缴守,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站屡穗,受9級特大地震影響贴捡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜村砂,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一烂斋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧础废,春花似錦汛骂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歇僧,卻和暖如春图张,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诈悍。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工祸轮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侥钳。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓适袜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舷夺。 傳聞我的和親對象是個殘疾皇子苦酱,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361