LiteralliJeff 发表于 2022-7-17 17:08

Unity实现图片转字符画

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;
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
{
    private Texture2D Texture;
    private Text Text_Painter;
    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;
                m_StringBuilder.Append(value);
            }
            //每行画完换行
            m_StringBuilder.Append("\n");
      }
      //输出到文本上显示
      Text_Painter.text = m_StringBuilder.ToString();
    }


    void Start()
    {
      StartPaint();
    }

#if UNITY_EDITOR
    private void OnValidate()
    {
      StartPaint();
    }
#endif
}
页: [1]
查看完整版本: Unity实现图片转字符画