我们项目最近需要微信分享员工二维码功能,二维码图片直接使用zxing就可以生成,但是生成之后只有一个图片,而我们需求的要求是这样的:

没错就是二维码下边有一行提示文字,你可能会想直接imageview下边放个textview就行了,没错这样在你的APP里显示效果确实是达到了,但是还要在二维码分享到朋友圈或者其他朋友时也是这个样子的啊,所以没办法,只能是得到二维码图片时再重新创建一张图片把文字也画上来,分享的时候就分享新图片就可以了,这个实现起来也很简单的,下面就来说说怎么画。

思路:

1.获取到二维码图片的高度bitmapHeight宽度bitmapWidth;

2.根据文字大小计算出二维码宽度的一行可以放多少个文字count,然后根据文字长度和count计算出需要几行来显示文字;

3.之后新建一个Bitmap对象,它的宽度就是图片宽度,高度是图片高度+配文与图片间的间距+文字大小*文字行数+文字间的行间距*文字行数;

4.以Bitmap构建画布对象,先将二维码画上来,然后在二维码下边画出以配文与图片间的间距+文字大小*文字行数+文字间的行间距*文字行数为高度的一个白底矩形,用来盛放文字(这里说一下为什么要画这个矩形,是因为我们的项目要求可以保存这张图片,而保存到相册后,手机相册背景是黑色的,我们不画这个白色矩形背景的话,文字默认背景就是透明的,而文字如果设置成黑色,这时候就会感觉你的图片只有二维码没有下边的配文了,不符合要求,也不美观);

5.用一个循环来画出文字,返回新的图片。

思路就是这些了,我觉得我说的很细了,下边就看看代码吧,我写注释都很详细,就不再另外介绍了:

主要变量含义

/**传递进来的源图片*/
private Bitmap source;
/**图片的配文*/
private String text;
/**图片加上配文后生成的新图片*/
private Bitmap newBitmap;
/**配文的颜色*/
private int textColor = Color.BLACK;
/**配文的字体大小*/
private float textSize = 16;
/**图片的宽度*/
private int bitmapWidth;
/**图片的高度*/
private int bitmapHeight;
/**画图片的画笔*/
private Paint bitmapPaint;
/**画文字的画笔*/
private Paint textPaint;
/**配文与图片间的距离*/
private float padding = 20;
/**配文行与行之间的距离*/
private float linePadding = 5;

主要代码

bitmapWidth = source.getWidth();
bitmapHeight = source.getHeight();

//一行可以显示文字的个数
int lineTextCount = (int) ((source.getWidth()-50)/textSize);
//一共要把文字分为几行
int line = (int) Math.ceil(Double.valueOf(text.length())/Double.valueOf(lineTextCount));

//新创建一个新图片比源图片多出一部分,后续用来与文字叠加用
newBitmap = Bitmap.createBitmap(bitmapWidth,
        (int) (bitmapHeight+padding+textSize*line+linePadding*line), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(newBitmap);
//把图片画上来
canvas.drawBitmap(source,0,0,bitmapPaint);

//在图片下边画一个白色矩形块用来放文字,防止文字是透明背景,在有些情况下保存到本地后看不出来
textPaint.setColor(Color.WHITE);
canvas.drawRect(0,source.getHeight(),source.getWidth(),
        source.getHeight()+padding+textSize*line+linePadding*line,textPaint);

//把文字画上来
textPaint.setColor(textColor);
textPaint.setTextSize(textSize);

Rect bounds = new Rect();

//开启循环直到画完所有行的文字
for (int i=0; i<line; i++) {String s;
    if (i == line-1) {//如果是最后一行,则结束位置就是文字的长度,别下标越界哦
        s = text.substring(i*lineTextCount, text.length());
    } else {//不是最后一行
        s = text.substring(i*lineTextCount, (i+1)*lineTextCount);
    }//获取文字的字宽高以便把文字与图片中心对齐
    textPaint.getTextBounds(s,0,s.length(),bounds);
    //画文字的时候高度需要注意文字大小以及文字行间距
    canvas.drawText(s,source.getWidth()/2-bounds.width()/2,
            source.getHeight()+padding+i*textSize+i*linePadding+bounds.height()/2,textPaint);
}canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();

Android把文字写到图片上生成图片+文字的新图片相关推荐

  1. 在图片上添加文字并生成图片

    在图片上添加文字并生成图片 开发工具与关键技术:Visual Studio 2015 作者:李德新 撰写时间:2019年6月04日 在我们的日常生活中,我们经常能看到各样格式的表单,而且有时候我们还要 ...

  2. 图片上的文字用CSS写出毛玻璃效果

    图片上的文字用CSS写出毛玻璃效果  2016-10-04 08:11    网页设计   标签:css   1297    发表评论 半透明颜色最初的使用场景之一就是作为背景.将其叠放在照片类或其他 ...

  3. C#实现图片叠加,图片上嵌入文字,文字生成图片的方法

    /// <summary>     /// 图片叠加     /// </summary>     /// <param name="sender"& ...

  4. android 长按 秒事件_原来手机长按2秒,能开启5个实用功能,一键提取图片上的文字...

    分享最实在的玩机技巧,洞察最前沿的科技资讯!大家好,这里是手机科技园! 随着科技的发展,手机上的功能越来越多,而且还非常实用,我也是今天才知道,原来手机长按2秒,能开启5个实用功能,感兴趣的朋友可以了 ...

  5. python3识别图中的文字_Python3.x:如何识别图片上的文字

    Python3.x:如何识别图片上的文字 安装pytesseract库,必须先安装其依赖的PIL及tesseract-ocr,其中PIL为图像处理库,而后面的tesseract-ocr则为google ...

  6. iOS在图片上添加文字 图片

    图片上添加文字,在网上找的都是iOS10弃用的一个方法(怕以后麻烦就找了另一种方法替代)弃用链接 简洁版 - (UIImage*)text:(NSString*)text addToImage:(UI ...

  7. Java实现在图片上添加文字(水印)

    今天分享一个:通过Java代码,给图片添加文字. 比如下面这个图片,我们在左下角就添加了一个文字版的水印,那么这是如何实现的呢 ? 目录 [1]获取原图片对象 (1.1)读取本地图片 (1.2)读取网 ...

  8. html和css的图片怎么加,html+css如何在图片上添加文字

    html+css如何在图片上添加文字 2018-09-14 效果如图 思路:div相对定位. 图片默认定位, 文字绝对定位 参考代码 html> /*div1下面 包含着1个图片和1段文字*/ ...

  9. 通过opencv在图片上加上文字_基于Ubuntu16

    本文主要介绍,如何通过**C++**语言在Ubuntu操作系统下的OpenCV中将一个图片叠加上文字 通过opencv在图片上叠加上文字 一.汉字点阵字库原理 1.汉字的三种编码 1.1区位码 1.2 ...

最新文章

  1. 关于软件产业的两个契机
  2. HP-UX Root密码被锁定的非关机情况下解决方案
  3. Logon database Tiger引起DataGuard不同步问题
  4. Ubuntu下eclipse indigo版在线安装hibernate插件
  5. 7.7. 其他证书工具
  6. html单页面显示多个文章,从单个html页面上的多个django应用模型获取数据
  7. 解决Windows安装TensorFlow报错:ERROR: Cannot uninstall 'wrapt'问题
  8. Prometheus的promql符号表示
  9. excel怎么在柱状图上加超链_如何让你的年终总结更符合领导心意,高薪员工必备的excel技能...
  10. 本地修改指向服务器,本地修改指向服务器
  11. error:bucket is protected
  12. 【智慧城市】GIS数据获取-获取道路/水路数据
  13. 开关三极管的导通和截止条件
  14. 【存储数据恢复】esx vmfs的互斥导致存储数据丢失的数据恢复案例
  15. 2022年端午送祝福语小程序源码+可对接流量主
  16. html5 show 案例
  17. 干货福利分享:pdf怎么去水印 如何在线去除PDF水印
  18. 大数据实战之用户画像概念、项目概述及环境搭建
  19. 校尉羽书飞瀚海,顺序表中增删改(Pt.2)
  20. java+jsp+servlet+sqlserver(mysql)出租车管理系统

热门文章

  1. probability是什么意思_probability是什么意思_probability怎么读_probability翻译_用法_发音_词组_同反义词_可能性-新东方在线英语词典...
  2. 郑州大学计算机系1996级校友,美术学院:1996级校友毕业二十周年返校聚会
  3. github 遇到的问题
  4. 2021年大数据发展十大趋势:抓准一个,就能掌握先机!
  5. 【调音小栈】普瑞声纳Revelator io24直播关联机架驱动跳线设置教程
  6. Hadoop之——机架感知配置
  7. 昱琛航空IPO被终止:曾拟募资5亿 郭峥为大股东
  8. 基于Eclipse IDE断点不能停下的问题解决(断点标志上带斜杠)
  9. 2022iqvia药品公司排名
  10. Boxes Packing