解决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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值