1. 程式人生 > >Android-圖片和base64字串互轉/刪除本地

Android-圖片和base64字串互轉/刪除本地

圖片工具類

package com.example.save_pic_delete;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.
os.Environment; import android.provider.MediaStore; import android.text.TextUtils; import android.util.Base64; import android.widget.ImageView; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.
OutputStream; /** * 圖片相關的工具類 */ public class ImageUtils { /** * base64字串轉化成圖片 */ public static String GenerateImage(Context context, String imgStr) { //對位元組陣列字串進行Base64解碼並生成圖片 if (imgStr == null) { //影象資料為空 UtilsTools.MsgBox(context, "圖片不能為空"); return
""; } try { //Base64解碼 byte[] b = Base64Utils.decode(imgStr); for (int i = 0; i < b.length; ++i) { if (b[i] < 0) {//調整異常資料 b[i] += 256; } } // 新生成的jpg圖片 // 新圖片的資料夾, 如果沒有, 就建立 String dirPath = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES).getAbsolutePath() + "/zdgj/"; File fileDir = new File(dirPath); if (!fileDir.exists()) { fileDir.mkdirs(); } // 資料夾現在存在了, 可以在此資料夾下建立圖片了 String imgFilePath = dirPath + System.currentTimeMillis() + ".jpg"; File file = new File(imgFilePath); if (!file.exists()) { file.createNewFile(); } OutputStream out = new FileOutputStream(imgFilePath); out.write(b); out.flush(); out.close(); SharedPrefUtil.putString(context, SharedPreConstant.FacePicPathKey, imgFilePath); UtilsTools.MsgBox(context, "圖片已儲存到本地"); return imgFilePath; } catch (Exception e) { UtilsTools.MsgBox(context, e.getMessage()); return ""; } } /** * 將圖片轉換成Base64編碼的字串 * * @param path 圖片本地路徑 * @return base64編碼的字串 */ public static String imageToBase64(String path) { if (TextUtils.isEmpty(path)) { return null; } InputStream is = null; byte[] data; String result = null; try { is = new FileInputStream(path); //建立一個字元流大小的陣列。 data = new byte[is.available()]; //寫入陣列 is.read(data); //用預設的編碼格式進行編碼 result = Base64.encodeToString(data, Base64.DEFAULT); } catch (IOException e) { e.printStackTrace(); } finally { if (null != is) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } /** * 在ImageView裡展示指定路徑的圖片 * * @param path 本地路徑 * @param imageView ImageView */ public static void ShowPic2View(Context context, String path, ImageView imageView) { File localFile; FileInputStream localStream; Bitmap bitmap; localFile = new File(path); if (!localFile.exists()) { UtilsTools.MsgBox(context, path + " is null."); } else { try { localStream = new FileInputStream(localFile); bitmap = BitmapFactory.decodeStream(localStream); imageView.setImageBitmap(bitmap); // if (localStream != null) { localStream.close(); // } } catch (Exception e) { e.printStackTrace(); UtilsTools.MsgBox(context, e.getMessage()); } } } /** * 刪除手機裡指定路徑的圖片 * * @param context Context * @param imgPath 本地路徑 */ public static void DeletePicFromMobile(Context context, String imgPath) { try { ContentResolver resolver = context.getContentResolver(); Cursor cursor = MediaStore.Images.Media.query(resolver, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=?", new String[]{imgPath}, null); boolean result; if (cursor.moveToFirst()) { long id = cursor.getLong(0); Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Uri uri = ContentUris.withAppendedId(contentUri, id); int count = context.getContentResolver().delete(uri, null, null); result = count == 1; } else { File file = new File(imgPath); result = file.delete(); } if (result) { UtilsTools.MsgBox(context, "刪除成功"); } } catch (Exception e) { UtilsTools.MsgBox(context, e.getMessage()); } } }

驗證圖片工具類的demo :

Activity :

package com.example.save_pic_delete;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    private ImageView iv_main;
    private TextView tv_delete;
    private TextView tv_check;

    private Context mContext;
    private String filePath1;
    private String filePath;
    private String base64Str;

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

        initView();

        mContext = this;

        // 原圖路徑
        filePath1 = "/storage/emulated/0/tencent/MicroMsg/WeiXin/mmexport1542093665881.jpg";
        // 展示原圖
        ImageUtils.ShowPic2View(mContext, filePath1, iv_main);
        // 原圖base64
        base64Str = ImageUtils.imageToBase64(filePath1);
        // base64的原圖另存為到本專案路徑
        filePath = ImageUtils.GenerateImage(mContext, base64Str);
    }

    private void initView() {
        iv_main = findViewById(R.id.iv_main);
        tv_delete = findViewById(R.id.tv_delete);
        tv_check = findViewById(R.id.tv_check);
        // 刪除
        tv_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 刪除本專案下儲存的那個指定路徑的圖片
                ImageUtils.DeletePicFromMobile(mContext, filePath);
            }
        });

        // 檢測
        tv_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File file = new File(filePath);
                if (!file.exists()) {
                    UtilsTools.MsgBox_Long(mContext, "這個圖片現在不存在");
                } else {
                    UtilsTools.MsgBox_Long(mContext, "這個圖片存在");
                }
            }
        });
    }
}

Activity的佈局 : (只有一個顯示base64轉出圖片的ImageView和一個刪除按鈕和一個檢測本張圖片還在不在本機的檢測按鈕)

<?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:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/iv_main"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:src="@color/colorAccent"/>

    <TextView
        android:id="@+id/tv_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="刪除本地的這個圖片"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/tv_check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="檢查本地的這個圖片是否存在"
        android:textStyle="bold"/>
</LinearLayout>

其他沒有註明的小類在其他文章中有貼過完整程式碼 :

其他拓展 : bitmap和base64互轉 : https://blog.csdn.net/qq_28261207/article/details/79849444