1. 程式人生 > >Android實戰技巧之三十七:圖片的Base64編解碼

Android實戰技巧之三十七:圖片的Base64編解碼

通常用Base64這種編解碼方式將二進位制資料轉換成可見的字串格式,就是我們常說的大串,10塊錢一串的那種,^_^。

Android的android.util包下直接提供了一個功能十分完備的Base64類供我們使用,下面就演示一下如何將一張圖片進行Base64的編解碼。

1.找到那張圖片

public void onEncodeClicked(View view) {

        //select picture
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, OPEN_PHOTO_FOLDER_REQUEST_CODE);
    }

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(OPEN_PHOTO_FOLDER_REQUEST_CODE == requestCode && RESULT_OK == resultCode) { //encode the image Uri uri = data.getData(); try
{ //get the image path String[] projection = {MediaStore.Images.Media.DATA}; CursorLoader cursorLoader = new CursorLoader(this,uri,projection,null,null,null); Cursor cursor = cursorLoader.loadInBackground(); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String path = cursor.getString(column_index); Log.d(TAG,"real path: "
+path); encode(path); } catch (Exception ex) { Log.e(TAG, "failed." + ex.getMessage()); } } }

2.將圖片轉換成bitmap並編碼

private void encode(String path) {
                //decode to bitmap
                Bitmap bitmap = BitmapFactory.decodeFile(path);
                Log.d(TAG, "bitmap width: " + bitmap.getWidth() + " height: " + bitmap.getHeight());
                //convert to byte array
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
                byte[] bytes = baos.toByteArray();

                //base64 encode
                byte[] encode = Base64.encode(bytes,Base64.DEFAULT);
                String encodeString = new String(encode);
                mTvShow.setText(encodeString);
}

3.將大串還原成圖片

    public void onDecodeClicked(View view) {
        byte[] decode = Base64.decode(mTvShow.getText().toString(),Base64.DEFAULT);
        Bitmap bitmap = BitmapFactory.decodeByteArray(decode, 0, decode.length);
        //save to image on sdcard
        saveBitmap(bitmap);
    }

    private void saveBitmap(Bitmap bitmap) {
        try {
            String path = Environment.getExternalStorageDirectory().getPath()
                    +"/decodeImage.jpg";
            Log.d("linc","path is "+path);
            OutputStream stream = new FileOutputStream(path);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream);
            stream.close();
            Log.e("linc","jpg okay!");
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("linc","failed: "+e.getMessage());
        }
    }

需要注意的是,一張圖片的編碼速度會很慢,如果圖片很大就更慢了。畢竟手機的處理能力有限。不過decode的速度確實相當的快,超出你的想象。好了,就是這樣簡單,今天就到這裡了,晚安!

相關推薦

Android實戰技巧圖片Base64解碼

通常用Base64這種編解碼方式將二進位制資料轉換成可見的字串格式,就是我們常說的大串,10塊錢一串的那種,^_^。 Android的android.util包下直接提供了一個功能十分完備的Base64類供我們使用,下面就演示一下如何將一張圖片進行Base64

Android實戰技巧Handler使用中可能引發的內存泄漏

sha 指向 ons har 引用 destroy 對象 from weak 問題描寫敘述 曾幾何時,我們用原來的辦法使用Handler時會有以下一段溫馨的提示: This Handler class should be static or le

Android實戰技巧瞭解native activity

1.native activity的意義 很多人覺得Android的Fwk提供的支援足夠好了,既然Google不推薦用Ndk開發為什麼又放寬Ndk的限制而推出可以無Java開發Android App呢?我的理解是不同的技術實現會有其適合的場景。 Ndk的適用

Android實戰技巧五 瞭解native activity

                     1.native activity的意義很多人覺得Android的Fwk提供的支援足夠好了,既然Google不推薦用Ndk開發為什麼又放寬Ndk的限制而推出可以無Java開發Android App呢?我的理解是不同的技術實現會有其適合的場景。 Ndk的適用場景官方給出

Android實戰技巧Usb通訊USB Host

零 USB背景知識 USB是一種資料通訊方式,也是一種資料匯流排,而且是最複雜的匯流排之一。 硬體上,它是用插頭連線。一邊是公頭(plug),一邊是母頭(receptacle)。例如,PC上的插座就是母頭,USB裝置使用公頭與PC連線。 目前USB硬體介面

Android實戰技巧Android原型設計工具探索

移動開發者、移動產品經理和互動設計師在有了產品的想法後會做出一系列的草圖,然後反覆推敲改進,直到自己滿意。這個草圖就是原型設計,是產品設計初期很重要的工作,它是產品的雛形,之後會以此為原型進行開發。 當移動網際網路熱度增加後,一些主打移動原型設計的工具如雨後春

Android實戰技巧啟動另一個App/apk中的Activity

Android提供了在一個App中啟動另一個App中的Activity的能力,這使我們的程式很容易就可以呼叫其他程式的功能,從而就豐富了我們App的功能。比如在微信中傳送一個位置資訊,對方可以點選這個位置資訊啟動騰訊地圖並導航。這個場景在現實中作用很大,尤其是朋

Android實戰技巧橫豎屏切換

這幾年一直在做手機上和電視盒的App,幾乎沒有考慮過橫豎屏切換的問題。電視盒好說,橫屏不變,你要是給它設計個豎屏人家也沒機會使;而手機上的應用就不好說了,有些介面你設計了橫豎屏相容可能是為了表示你的功能強大。但是按照慣例,或許也是設計師圖省事,我們只是做一個方案

Android實戰技巧Android5.1.1原始碼編譯與燒寫

購買Nexus手機的朋友大多是為了自己修改系統玩,再加上其較高的價效比,在開發者中還是廣受歡迎的。我的5太子被我升級到了6.0預覽版,玩的正嗨,捨不得換回到5.1時代了。不過鑑於距6.0原始碼釋出還有段日子,5.1的原始碼編譯與燒寫仍是主流,下面就記錄了整個過程

Android實戰技巧 Android5 1 1原始碼編譯與燒寫

                     購買Nexus手機的朋友大多是為了自己修改系統玩,再加上其較高的價效比,在開發者中還是廣受歡迎的。我的5太子被我升級到了6.0預覽版,玩的正嗨,捨不得換回到5.1時代了。不過鑑於距6.0原始碼釋出還有段日子,5.1的原始碼編譯與燒寫仍是主流,下面就記錄了整個過程(持續

Android實戰技巧 Linux下的模擬器硬體加速

                     Intel提供了一個叫HAXM的虛擬硬體加速技術,全稱為:Intel Hardware Accelerated Execution Manager. 只要你的CPU是intel的產品並且支援VT(virtualization Technology)就可以使用HAXM技

Android實戰技巧最新Android開發環境(Eclipse+ADT+Android 5.0)

一、一切由執行時錯誤引起dalvikvm Could not find class '引用包.類', referenced from method... 其實在編譯時也會見到如下錯誤:       [dx]        [dx] trouble processing:   

Linux運維學習筆記監控利器Nagios實戰

第四十二章 監控利器Nagios實戰一、Nagios介紹1、哪些內容需要監控呢?(1)本地資源a、負載:uptime;b、CPU:top,sar,cpu溫度;c、磁碟:df;d、記憶體:free;e、IO:iostat;f、RAIDg、passwd檔案的變化(本地所有檔案指紋

Linux運維學習筆記 防火牆實戰

第四十三章 防火牆實戰一、Iptables基礎概念1、一般使用情況(1)seLinux關閉(生產系統也是關閉的)(2)使用硬體ids(入侵檢測)(3)iptables在生產環境中一般是內閘道器閉,外網開啟。在大併發的情況下,不能開iptables,影響效能,這時可以使用硬體防

Java經典程題50道

static new for length print ati class 個人 經典 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。 public class Example37 { publ

易寶典——玩轉O365中的EXO服務 保留所有郵箱

雲計算 Office 365 微軟 Exchange 保留所有郵箱 在企業中會遇到的一個典型的案例,即為了保證企業的商業利益,需要將所有郵箱均設置為保留狀態。如前所述,在進行郵件保留時,可以采用就地保留或訴訟保留。就地保留不僅可以基於用戶郵箱實現,還可以基於郵件組或Office 365組實

python程基礎

轉換 類型 nbsp 三十七 應用 進制 關系數據庫 XML 編程基礎 數據的持久化:數據持久化就是將內存中的對象轉換為存儲模型,以及將存儲模型轉換為內存中的對象的統稱. 對象可以是任何數據結構或對象模型,存儲模型可以是關系模型、XML、二進制流等 Python的數據持久化

Android實戰技巧六 PreferenceActivity使用詳解

                一、寫作前面當我們做應用的時候,需要使用者配置一些資訊,而這就是通常所說的應用設定。對於Android系統來說,系統本身的設定帶來的使用者體驗和習慣已經深入人心,在我們的應用中同樣用到類似的設定頁,那麼使用者使用起來就會更加親切和方便。是嗎?那我們應該怎麼做到呢?這就要靠本文的

Android問題集錦二 Failure INSTALL FAILED NO MATCHING ABIS

                     這個問題出現在模擬器上的概率更大些,原因是某些應用使用了原生庫(NDK,Native Lib),這些庫的編譯目標通常是arm架構的cpu,在x86上執行就會報這樣的錯誤。 比如我看了一下報錯的應用,果然有很多so在lib下。$ ls lib/armeabi/libap

ReactNative系列指定模擬器除錯

前言 React Native執行專案會自動啟動模擬器或者真機,下面為指定啟動模擬器的方法 注意:執行專案之前執行npm install是必須的 1. Android Android執行React Native專案有兩種方式: 1.1 終端 命令列中React nati