|
Unity实现图片转字符画
将一张图不断的放大, 最后会显示成一个个色块, 这个其实就是图片的像素点, 图片都是由像素点组成的. 那么我们将对应的颜色替换成相应的字符, 即可实现字符画
方案
颜色的色值通常是RGB组成, 将0~255的颜色先进行灰度调整, 然后把每个位置对应的像素点和字符做个对应即可.
先定义一下需要的字符(按照从稠密到稀疏的方向做排序, 反过来也可以,影响的只是底图的显示)
private readonly string m_Chars = "@*#$%XB0H?OC7>+v=~^:_-'`. ";
然后灰度处理
var grayRGB = (int) (color.r * 255 * 0.299 + color.g * 255 * 0.587 + color.b * 255 * 0.114);
色块和字符映射
int index = (int) (grayRGB / 256.0f * (m_Chars.Length));
var value = m_Chars[index];
Unity的rgb是0-1范围,这里为了处理方便转换到0-255了,然后字符的下标为了避免超出范围,这里是除以256
最后看下处理效果
效果
自己随手画了两幅画, 用来做个测试
*B^^~$*
.*^^^^^^^^^*
?^^^::^^^^^^^C~
0^^^^^^^^^^^^^^~_
:^^^^^^^^^^^^:^^$
$^^^^^^^^^^^^^^^^^*
H^^^^^^^^^^^^^^^^^^=
$^^^^^^^^^^^^^^^^^^^$
~^^^^^^^^^^^^^^^^^::$
^^^^^^^^^^^^^^^^^^^^0
^^^^^^^^^^^^^^^^^^^^^v
7^^^^^^^^^^^^^^^^^^^^=
_^^^^^^^^^^^^^^^^^^^^?
^^^^^^^^^^*C^^^^^^^^# .#@$@~
#^^^^^^^^?@*^^^^^^^^% @777777*
%^^^^^^^^v*$^^^^^^^^ ~777777777*
v^^^^^^^^C^^^^^^^^X ^7@77777777C$
%^^^^^^^^^^^^^^^^~B .777*7777777$C
#^^^^^^^^^^^^^^^+* #7777777777*77*
$^^^^^^^^^^^^^^^? #77777#77777H777v
%^^^^^^^^^^^^^^^ H77777%7777**777$
*H^^^^^^^^^^: #777777X@??@7*7777C
:^_^^:*v^^^^ #@77777?77777*7777%
O*#^ $^^^^^ 77%$7>#777777$7777>.
%^^^^^.777777777777*`77777#
^^^^:777777X77777#77*777X.
#^^^:@77777??7*7*7777700>7$
^^^^*7777C7777*%777777777'$
*^^^*0777%77777@7777777%@_+
-^^::`#7%7777777$770@7____$
*^^*__:_+7XX%%X7_______0X
*^:B_______________%?:^O
#^^:*+__________*>^^^^$
?^:^^^C*^`~@#^^^:^^^@H^:=*`
HB*^^^^^^^^^^^^^^^^^$$::^^^#
*^^^v*+^^^^^^^^^^^-X=> .
^^^^^*^~*^^^^^^:.*#^^^.
_@$*O$^^^__#**@+*^>^^^
^^^^X **^^^%
@0*7 *^''
~
#* ~_#
__ `@__?
__? *
H____+.O = `O___:
C__*___C*@@ @@ *___%
?? >___>* *0
.?0 *@H. *+---------@%
B?B *~HHHHHHBH`=---------H----->
** ^ %HHHHHHH$----@@-----@@@----#
# $ 'HHHHHHHH----@@-----*@@----_
@ _ ??HHHHHX------------------#
^ $H?HHH$----------------$
?H?* H------------*
HHH@ %H$ .` $
$HHH 0HH# #
HH% 0O
#X *`@ %
' *> ?@
? ?H源码
完整代码如下
using System.Text;
using UnityEngine.UI;
using UnityEngine;
public class CharPainter : MonoBehaviour
{
[SerializeField] private Texture2D Texture;
[SerializeField] private Text Text_Painter;
[SerializeField] private int Space = 10;
private readonly string m_Chars = "@*#$%XB0H?OC7>+v=~^:_-'`. ";
private StringBuilder m_StringBuilder = new StringBuilder(4096);
void StartPaint()
{
//记录一个string
m_StringBuilder.Remove(0, m_StringBuilder.Length);
//从上到下, 从左到右, 依次画
for (int j = Texture.height - 1; j >= 0; j -= Space)
{
for (int i = 0; i < Texture.width; i += Space)
{
//读取当前的像素点的颜色
var color = Texture.GetPixel(i, j);
//灰度处理
var grayRGB = (int) (color.r * 255 * 0.299 + color.g * 255 * 0.587 + color.b * 255 * 0.114);
//取出对应的字符
int index = (int) (grayRGB / 256.0f * (m_Chars.Length));
var value = m_Chars[index];
m_StringBuilder.Append(value);
}
//每行画完换行
m_StringBuilder.Append(&#34;\n&#34;);
}
//输出到文本上显示
Text_Painter.text = m_StringBuilder.ToString();
}
void Start()
{
StartPaint();
}
#if UNITY_EDITOR
private void OnValidate()
{
StartPaint();
}
#endif
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|