找回密码
 立即注册
查看: 332|回复: 0

Unity实现图片转字符画

[复制链接]
发表于 2022-7-17 17:08 | 显示全部楼层 |阅读模式
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("\n");
        }
        //输出到文本上显示
        Text_Painter.text = m_StringBuilder.ToString();
    }


    void Start()
    {
        StartPaint();
    }

#if UNITY_EDITOR
    private void OnValidate()
    {
        StartPaint();
    }
#endif
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 15:10 , Processed in 0.093470 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表