首页 > 系统 > Android > 正文

Android实现用文字生成图片的示例代码

2019-12-12 02:13:24
字体:
来源:转载
供稿:网友

本文介绍了Android实现用文字生成图片的示例代码,分享给大家,具体如下:

效果图

我们先来看看效果图,可以看到下图由各种颜色的”美”字拼接而成,形成了一张不一样的图片。

原理

生成这种图片的原理很简单,但是当时看开源项目时愣是看不懂,因为没学过Python,但是仔细研究,终于能慢慢的理解该开源项目源码,并把它改写成Android平台的源代码。下面把这个算法的主要内容讲给大家,该算法大致原理如下:

1.根据原图片的大小和字体的大小创建一张空白图片

2.把原图片按字体的大小分成若干块,取每一块的像素的颜色的平均值

3.将指定文本以得到的平均颜色画在新建的空白图上

package com.luoye.fpic.util;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;public class Utils {  /**   * 核心,文本转成图片   * @param bitmap 原图片   * @param text 文本   * @param fontSize 文字大小   * @return 转好的图片   */  public static Bitmap getTextBitmap(Bitmap bitmap, String text, int fontSize)  {    if(bitmap==null)      throw new IllegalArgumentException("Bitmap cannot be null.");    int picWidth=bitmap.getWidth();    int picHeight=bitmap.getHeight();    Bitmap back= Bitmap.createBitmap((bitmap.getWidth()%fontSize==0)?bitmap.getWidth():((bitmap.getWidth()/fontSize+1)*fontSize)        ,(bitmap.getHeight()%fontSize==0)?bitmap.getHeight():((bitmap.getHeight()/fontSize+1)*fontSize)        , Bitmap.Config.ARGB_8888);    Canvas canvas=new Canvas(back);    canvas.drawColor(0xfff);    int idx=0;    for(int y=0;y<picHeight;y+=fontSize)    {      for(int x=0;x<picWidth;x+=fontSize)      {        int[] colors=getPixels(bitmap,x,y,fontSize,fontSize );        Paint paint=new Paint();        paint.setAntiAlias(true);        paint.setColor(getAverage(colors));        paint.setTextSize(fontSize);        Paint.FontMetrics fontMetrics =paint.getFontMetrics();        float padding=(y==0)?(fontSize+fontMetrics.ascent):((fontSize+fontMetrics.ascent)*2);        canvas.drawText(String.valueOf(text.charAt(idx++)),x,y-padding,paint);        if(idx==text.length())        {          idx=0;        }      }    }    return back;  }  /**   * 获取某一块的所有像素的颜色   * @param bitmap   * @param x   * @param y   * @param w   * @param h   * @return 颜色数组   */  private static int[] getPixels(Bitmap bitmap,int x,int y,int w,int h)  {    int[] colors=new int[w*h];    int idx=0;    for (int i=y;(i<h+y)&&(i<bitmap.getHeight());i++)    {      for (int j=x;(j<w+x)&&(j<bitmap.getWidth());j++)      {        int color=bitmap.getPixel(j,i);        colors[idx++]=color;      }    }    return colors;  }  /**   * 求多个颜色的平均值   * @param colors   * @return 平均颜色   */  private static  int getAverage (int[] colors)  {    //int alpha=0;    int red=0;    int green=0;    int blue=0;    for(int color:colors)    {      red += ((color&0xff0000)>>16);      green += ((color&0xff00)>>8);      blue += (color&0x0000ff);    }    float len=colors.length;    //alpha=Math.round(alpha/len);    red=Math.round(red/len);    green=Math.round(green/len);    blue=Math.round(blue/len);    return Color.argb(0xff,red,green,blue);  }  private static void log(String log)  {    System.out.println("-------->Utils:"+log);  }}

相关链接

参考的开源项目:https://github.com/xlzd/img2html

完整的android代码:https://github.com/luoyesiqiu/textImg

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表