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

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

效果图

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

1b8f359cde08c8244ecd81e452d9fe96.png

原理

生成这种图片的原理很简单,但是当时看开源项目时愣是看不懂,因为没学过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

{

for(int x=0;x

{

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

{

for (int j=x;(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);

}

}

相关链接

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值