1. 程式人生 > >Android 電子簽名,手寫簽名案列實現方法,並上傳網頁顯示(base64)!

Android 電子簽名,手寫簽名案列實現方法,並上傳網頁顯示(base64)!

最近說專案可能會用到一個電子簽名,不需要識別的那種,只是一個單純手寫簽名,然後以base64的格式提供給前端web頁面。其實挺簡單的,自定義一個手寫view就上線了。Android 電子簽名,手寫簽名案列實現方法!
先上圖:
這裡寫圖片描述

按鈕說明:第一個按鈕是清除手寫板,第二個是將手寫板的內容生成圖片並壓縮,第三個按鈕是觸發JS方法,在web頁面中顯。
佈局說明:中間區域是手寫屈,左上角是經過大小和質量壓縮後的圖片,右邊是以base64格式上傳web頁面還原出來的圖片。
程式碼說明:其實很簡單,自定義CanvasView繼承View
第一步:構造方法裡面初始化畫布背景、畫筆、和路徑

 public CanvasView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setBackgroundColor(Color.WHITE);
        paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStrokeWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, STROKE_WIDTH, getResources().getDisplayMetrics
())); paint.setStyle(Paint.Style.STROKE);//設定畫筆空心 paint.setAntiAlias(true);//消除鋸齒 path = new Path(); }

第二部:畫筆歸為

   @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(path, paint);
    }

第三步:處理手勢,觸發畫筆

    @Override
    public
boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(x, y); break; case MotionEvent.ACTION_MOVE: path.lineTo(x, y); break; } invalidate(); return true; }

到這裡,手寫功能就已經能使用了,接下來是做一些處理
1、將view生成圖片

    //將view生生圖片
    public Bitmap createBitmap (View v) {

        int w = v.getWidth();    
        int h = v.getHeight();
        //生成圖片
        Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);    
        Canvas c = new Canvas(bmp);     
        c.drawColor(Color.WHITE); 
        v.layout(0, 0, w, h);    
        v.draw(c);      
        return bmp;

    }

2、圖片是否要旋轉

    /**
     * 圖片旋轉
     * @param tmpBitmap
     * @param degrees
     * @return
     */
    public static Bitmap rotateToDegrees(Bitmap tmpBitmap, float degrees) {
        Matrix matrix = new Matrix();
        matrix.reset();
        matrix.setRotate(degrees);
        Bitmap rBitmap = Bitmap.createBitmap(tmpBitmap, 0, 0, tmpBitmap.getWidth(), tmpBitmap.getHeight(), matrix,
                true);
        return rBitmap;
    }

3、圖片按比例壓縮

    /** 
     * 圖片按比例大小壓縮方法 
     * 
     * @param image (根據Bitmap圖片壓縮) 
     * @return 
     */  
    public static Bitmap compressScale(Bitmap image) {  

        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  

        // 判斷如果圖片大於1M,進行壓縮避免在生成圖片(BitmapFactory.decodeStream)時溢位  
        if (baos.toByteArray().length / 1024 > 1024) {  
            baos.reset();// 重置baos即清空baos  
            image.compress(Bitmap.CompressFormat.JPEG, 80, baos);// 這裡壓縮50%,把壓縮後的資料存放到baos中  
        }  
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
        BitmapFactory.Options newOpts = new BitmapFactory.Options();  
        // 開始讀入圖片,此時把options.inJustDecodeBounds 設回true了  
        newOpts.inJustDecodeBounds = true;  
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
        newOpts.inJustDecodeBounds = false;  
        int w = newOpts.outWidth;//原始寬高 
        int h = newOpts.outHeight;

        // 縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可  (可根據原始高度計算)
        int be = 4;// be=1表示不縮放 ,縮放比為1/be ,這裡縮小為原來的四分之一
        newOpts.inSampleSize = be; // 設定縮放比例  
        // newOpts.inPreferredConfig = Config.RGB_565;//降低圖片從ARGB888到RGB565  

        // 重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了  
        isBm = new ByteArrayInputStream(baos.toByteArray());  
        bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  

        return compressImage(bitmap,5);// 壓縮好比例大小後再進行質量壓縮  

//        return bitmap;  
    } 

4、圖片按照質量壓縮

    /** 
     * 質量壓縮方法 
     * 
     * @param image  size(kb)
     * @return 
     */  
    public static Bitmap compressImage(Bitmap image,int size) {  

        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 質量壓縮方法,這裡100表示不壓縮,把壓縮後的資料存放到baos中  
        int options = 80;  

        while (baos.toByteArray().length / 1024 > size) { // 迴圈判斷如果壓縮後圖片是否大於size,大於繼續壓縮  

            if(options<10) {
                options = 10;
            }

            baos.reset(); // 重置baos即清空baos  
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 這裡壓縮options%,把壓縮後的資料存放到baos中  
            options -= 10;// 每次都減少10
        }  
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把壓縮後的資料baos存放到ByteArrayInputStream中  
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream資料生成圖片  (PS,這一步操作後,圖片質量會變大,沒有搞懂為什麼,知道的大神可以給我解釋下[email protected]
        return bitmap;  
    }

5、將圖片處理成base64的字串

 /**
    *   
    * 圖片轉化成base64字串
    * 建立人:lxj  
    * 建立時間:2018年3月6日 上午10:14:02   
    * @version    
    *
    */
    public  String imageToBase64() {//將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理  
        String imgFile = Environment.getExternalStorageDirectory()+ "/" + imageName + ".jpg";//待處理的圖片  
        InputStream in = null;  
        byte[] data = null;  
        //讀取圖片位元組陣列  
        try   
        {  
            in = new FileInputStream(imgFile);          
            data = new byte[in.available()];  
            in.read(data);  
            in.close();  
        }   
        catch (IOException e)   
        {  
            e.printStackTrace();  
        }  
        return Base64.encodeToString(data, Base64.DEFAULT); //返回Base64編碼過的位元組陣列字串  
    }  
    /** 
     * 將Bitmap轉換成Base64字串 
     * @param bit 
     * @return 
     */  
    public String Bitmap2StrByBase64(Bitmap bit){  
       ByteArrayOutputStream bos=new ByteArrayOutputStream();  
       bit.compress(CompressFormat.JPEG, 100, bos);//引數100表示不壓縮  
       byte[] bytes=bos.toByteArray();  
       return Base64.encodeToString(bytes, Base64.DEFAULT);  
    } 

demo下載地址,希望對大家有所幫助:http://download.csdn.net/download/u010886975/10271229