解決Android 微信分享小程序圖片顯示不全

// 先按5:4生成一張白色背景圖片 

        int width;
        int height;
        // 先按5:4生成一張白色背景圖片
        boolean isWidthLong = bitmap.getWidth() > bitmap.getHeight();
        if (isWidthLong) {
            width = bitmap.getWidth();
            height = width * 4 / 5;// 微信顯示小程序的圖片是5:4
        } else {
            height = bitmap.getHeight();
            width = height * 5 / 4;
        }
        width = width * 5 / 4;// 這個倍數多次測試之後顯示效果最佳
        height = height * 5 / 4;
        Bitmap mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

// 再將顯示的圖和背景圖合成一張圖片 

        if (isWidthLong) {
            mCanvas.drawBitmap(bitmap, 0, (height - height_head) / 4, mPicturePaint);
        } else {
            mCanvas.drawBitmap(bitmap, (width - width_head) / 4, 0, mPicturePaint);
        }

下面是完整代碼 

public static Bitmap drawWXMiniBitmap(Bitmap bitmap) {
        int width;
        int height;
        // 先按5:4生成一張白色背景圖片
        boolean isWidthLong = bitmap.getWidth() > bitmap.getHeight();
        if (isWidthLong) {
            width = bitmap.getWidth();
            height = width * 4 / 5;// 微信顯示小程序的圖片是5:4
        } else {
            height = bitmap.getHeight();
            width = height * 5 / 4;
        }
        width = width * 5 / 4;// 這個倍數多次測試之後顯示效果最佳
        height = height * 5 / 4;
        Bitmap mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        // 用這個Bitmap生成一個Canvas,然後canvas就會把內容繪製到上面這個bitmap中
        Canvas mCanvas = new Canvas(mBitmap);
        mCanvas.drawColor(Color.WHITE);
        // 繪製畫筆
        Paint mPicturePaint = new Paint();
        // 繪製背景圖片
        mCanvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPicturePaint);
        // 繪製圖片的寬、高
        int width_head = bitmap.getWidth();
        int height_head = bitmap.getHeight();
        // 繪製圖片--保證其在水平方向居中
        if (isWidthLong) {
            mCanvas.drawBitmap(bitmap, 0, (height - height_head) / 4, mPicturePaint);
        } else {
            mCanvas.drawBitmap(bitmap, (width - width_head) / 4, 0, mPicturePaint);
        }
        //        mCanvas.drawBitmap(bitmap, 0, 0, mPicturePaint);
        // 保存繪圖爲本地圖片
        mCanvas.save();
        mCanvas.restore();
        while (isOverSize(mBitmap, MAX_WX_IMAGE)) {
            mBitmap = imageZoom(mBitmap);
        }
        return mBitmap;
    }

附上兩個工具函數

public static boolean isOverSize(Bitmap bitmap, int maxSize) {
        // 將bitmap放至數組中,意在bitmap的大小(與實際讀取的原文件要大)
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] b = baos.toByteArray();
        // 將字節換成KB
        double mid = b.length / 1024;
        LogUtils.d("isOverSize : " + mid);
        // 判斷bitmap佔用空間是否大於允許最大空間 如果大於則壓縮 小於則不壓縮
        return mid > maxSize;
    }



public static Bitmap imageZoom(Bitmap src_bitmap) {
        // 圖片允許最大空間 單位:KB
        double maxSize = MAX_WX_IMAGE;//32
        // 將bitmap放至數組中,意在bitmap的大小(與實際讀取的原文件要大)
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        src_bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] b = baos.toByteArray();
        // 將字節換成KB
        double mid = b.length / 1024;
        // 判斷bitmap佔用空間是否大於允許最大空間 如果大於則壓縮 小於則不壓縮
        if (mid > maxSize) {
            // 獲取bitmap大小 是允許最大大小的多少倍
            double i = mid / maxSize;
            LogUtils.d("i : " + i);
            // 開始壓縮 此處用到平方根 將寬帶和高度壓縮掉對應的平方根倍 (1.保持刻度和高度和原bitmap比率一致,壓縮後也達到了最大大小佔用空間的大小)
            Bitmap bitmap = zoomImage(src_bitmap, src_bitmap.getWidth() / Math.sqrt(i),
                    src_bitmap.getHeight() / Math.sqrt(i));
            return bitmap;
        }
        return src_bitmap;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章