zoukankan      html  css  js  c++  java
  • 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  " + 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的速度确实相当的快,超出你的想象。好了,就是这样简单,今天就到这里了,晚安!

  • 相关阅读:
    【GStreamer开发】GStreamer基础教程14——常用的element
    【GStreamer开发】GStreamer基础教程12——流
    【GStreamer开发】GStreamer基础教程12——流
    【GStreamer开发】GStreamer基础教程11——调试工具
    【GStreamer开发】GStreamer基础教程11——调试工具
    【GStreamer开发】GStreamer基础教程10——GStreamer工具
    【GStreamer开发】GStreamer基础教程10——GStreamer工具
    【GStreamer开发】GStreamer基础教程09——收集媒体信息
    【GStreamer开发】GStreamer基础教程08——pipeline的快捷访问
    【GStreamer开发】GStreamer基础教程08——pipeline的快捷访问
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7015838.html
Copyright © 2011-2022 走看看