专栏首页Android干货bitmap+文本生成新的bitmap的实现

bitmap+文本生成新的bitmap的实现

注:参数content为生成二维码bitmap的内容,该二维码bitmap在和文本title组合生成一个新的bitmap

package info.ecloud.merchant.util;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.journeyapps.barcodescanner.BarcodeEncoder;

import java.util.Hashtable;



public class SaveImageUtils {

    private static final String CHARSET = "UTF-8";
    /**
     * 生成图片  加上title的图片
     * @param content
     * @param title
     * @return
     */
    public static Bitmap createImage(String content,String title) {
        int picWidth = 520;//生成图片的宽度
        int picHeight = 565;//生成图片的高度
        int titleTextSize = 25;
        int textColor = Color.BLACK;
        int qrWidth = 370;
        int qrHeight = 370;
        int paddingTop = 5;
        int paddingMiddle = 20;
        int paddingBottom = 20;

        //最终生成的图片
        Bitmap result = Bitmap.createBitmap(picWidth,picHeight,Bitmap.Config.ARGB_8888);

        Paint paint = new Paint();
        paint.setColor(Color.WHITE);
        Canvas canvas = new Canvas(result);

        //先画一整块白色矩形块
        canvas.drawRect(0,0,picWidth,picHeight,paint);

        //画title文字
        Rect bounds = new Rect();
        paint.setColor(textColor);
        paint.setTextSize(titleTextSize);
        //获取文字的字宽高,以便将文字与图片中心对齐
        paint.getTextBounds(title,0,title.length(),bounds);
        //画白色矩形块
        int qrTop = paddingTop+titleTextSize+paddingMiddle;//二维码的顶部高度

        //画二维码
        Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 5);
        Bitmap image = null;
        try {
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            image = barcodeEncoder.encodeBitmap((String) content, BarcodeFormat.QR_CODE, 400, 400);
        } catch (Exception e) {
            e.printStackTrace();
        }

        paint.setColor(Color.BLACK);
        canvas.drawBitmap(image,(picWidth-qrWidth)/2,qrTop,paint);

        //画文字
        paint.setColor(Color.BLACK);
        paint.setTextSize(titleTextSize);
        int line = 3;
        int textTop = qrTop+qrHeight+paddingBottom;//地址的顶部高度

        for (int i = 0 ; i < line ; i++){
            String[] split = title.split("-");
            paint.getTextBounds(title,0,split[i].length(),bounds);
            canvas.drawText(split[i],picWidth/2-bounds.width()/2,textTop+i*titleTextSize+i*5+bounds.height()/2,paint);
        }

        canvas.save();
        canvas.restore();

        return result;
    }


}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 万能适配器

    听着music睡
  • 自定义控件详解(五):onMeasure()、onLayout()

    听着music睡
  • Android开发实战(十八):Android Studio 优秀插件:GsonFormat                       Android Studio 优秀插件(二): Parce

    听着music睡
  • 深度优先算法与最小生成树

    用户1418372
  • LeetCode 排列组合 题目汇总

    Given a collection of distinct numbers, return all possible permutations.

    Yano_nankai
  • 使用Java语言从零开始创建区块链

    目前网络上关于区块链入门、科普的文章不少,本文就不再赘述区块链的基本概念了,如果对区块链不是很了解的话,可以看一下我之前收集的一些入门学习资源:http://b...

    Java团长
  • 【原创】Java并发编程系列12 | 揭秘CAS

    并发编程,为了保证数据的安全,需要满足三个特性:原子性、可见性、有序性。Java 中可以通过锁和 CAS 的方式来实现原子操作。

    java进阶架构师
  • [Java 进阶]异常

    异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。 世上没有百分之百完美的程序。程序总难免存在各式各样的问题。所以,程序中添加对于错...

    静默虚空
  • 代理模式(控制对象访问)

    最近在读 Android Binder 部分的源码,之前三三两两的读过一些片段。但总是感觉理解的不深刻,在读源码的过程中看到了代理模式的应用,那便把代理模式单独...

    幺鹿
  • Java方法的嵌套与递归调用

    方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是...

    聚沙成塔

扫码关注云+社区

领取腾讯云代金券