一、老规矩,先看效果:

1、原图一

生成效果图一:

2、原图二

生成效果图二:

3、原图三:

生成效果图三之1:

效果图三之2:

说明:图三中同样的原图,生成的ASCII字符串大小不同,因为所取参数不同。

二、关键源代码:

// 调整行距: AdjustLineSpace.cs

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace Com.BrawDraw.Controls.Helper
{
    public static class AdjustLineSpace
    {
        public const int WM_USER = 0x0400;
        public const int EM_GETPARAFORMAT = WM_USER + 61;
        public const int EM_SETPARAFORMAT = WM_USER + 71;
        public const long MAX_TAB_STOPS = 32;
        public const uint PFM_LINESPACING = 0x00000100;
        [StructLayout(LayoutKind.Sequential)]
        private struct PARAFORMAT2
        {
            public int cbSize;
            public uint dwMask;
            public short wNumbering;
            public short wReserved;
            public int dxStartIndent;
            public int dxRightIndent;
            public int dxOffset;
            public short wAlignment;
            public short cTabCount;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public int[] rgxTabs;
            public int dySpaceBefore;
            public int dySpaceAfter;
            public int dyLineSpacing;
            public short sStyle;
            public byte bLineSpacingRule;
            public byte bOutlineLevel;
            public short wShadingWeight;
            public short wShadingStyle;
            public short wNumberingStart;
            public short wNumberingStyle;
            public short wNumberingTab;
            public short wBorderSpace;
            public short wBorderWidth;
            public short wBorders;
        }
        [DllImport("user32", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, ref PARAFORMAT2 lParam);

/// <summary>
        /// 调整行距。使用方法:SetLineSpace(richTextBox1, 40);
        /// </summary>
        /// <param name="ctl">控件</param>
        /// <param name="height">要指定的行高像素</param>
        public static void SetLineSpace(Control ctl, int height)
        {
            //1像素=15缇。
            int dyLineSpacing = height * 15;
            //4:dylinespace成员以  缇。的形式指定从一行到下一行的间距。控件使用指定的精确间距,即使dylinespace指定的值小于单个间距。
            //3:dylinespace成员以  缇。的形式指定从一行到下一行的间隔。但是,如果dylinespace指定的值小于单间距,则控件将显示单间距文本。
            byte bLineSpacingRule = (byte)3;
            PARAFORMAT2 fmt = new PARAFORMAT2();
            fmt.cbSize = Marshal.SizeOf(fmt);
            fmt.bLineSpacingRule = bLineSpacingRule;
            fmt.dyLineSpacing = dyLineSpacing;
            fmt.dwMask = PFM_LINESPACING;
            try
            {
                SendMessage(new HandleRef(ctl, ctl.Handle), EM_SETPARAFORMAT, bLineSpacingRule, ref fmt);
            }
            catch
            { }
        }

}
}

/// <summary>
        /// 将图像转为ASCII字符串
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="ImageSize"></param>
        /// <param name="Quick"></param>
        /// <returns></returns>
        public static string ConvertImageToASCii(Stream stream, int ImageSize, bool isQuick)
        {
            int num;
            StringBuilder builder = new StringBuilder();
            Image original = Image.FromStream(stream);
            Bitmap image = new Bitmap(original, new Size(original.Width, original.Height));
            original.Dispose();
            Rectangle destRect = new Rectangle(0, 0, image.Width, image.Height);
            ColorMatrix newColorMatrix = new ColorMatrix();
            newColorMatrix[0, 0] = 0.3333333f;
            newColorMatrix[0, 1] = 0.3333333f;
            newColorMatrix[0, 2] = 0.3333333f;
            newColorMatrix[1, 0] = 0.3333333f;
            newColorMatrix[1, 1] = 0.3333333f;
            newColorMatrix[1, 2] = 0.3333333f;
            newColorMatrix[2, 0] = 0.3333333f;
            newColorMatrix[2, 1] = 0.3333333f;
            newColorMatrix[2, 2] = 0.3333333f;
            ImageAttributes imageAttr = new ImageAttributes();
            imageAttr.SetColorMatrix(newColorMatrix);
            Graphics graphics = Graphics.FromImage(image);
            graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, imageAttr);
            graphics.Dispose();
            switch (ImageSize)
            {
                case 1:
                    num = 1;
                    break;

case 2:
                    num = 2;
                    break;

case 3:
                    num = 6;
                    break;

case 4:
                    num = 8;
                    break;

case 5:
                    num = 10;
                    break;

default:
                    num = 3;
                    break;
            }
            int num2 = num * 2;
            int num3 = num * num2;
            
            for (int i = 0; i < (image.Height / num2); i++)
            {
                builder.Append("\t");
                int num5 = i * num2;
                for (int j = 0; j < (image.Width / num); j++)
                {
                    int x = j * num;
                    int num8 = 0;
                    if (isQuick)
                    {
                        for (int k = 0; k < num; k++)
                        {
                            try
                            {
                                int num10 = (int)(image.GetPixel(x, k + num5).GetBrightness() * 100f);
                                num8 += num10;
                            }
                            catch
                            {
                                num8 += 50;
                            }
                        }
                    }
                    else
                    {
                        for (int m = 0; m < num; m++)
                        {
                            for (int n = 0; n < num2; n++)
                            {
                                int y = m + num5;
                                int num14 = n + x;
                                try
                                {
                                    int num15 = (int)(image.GetPixel(num14, y).GetBrightness() * 100f);
                                    num8 += num15;
                                }
                                catch
                                {
                                    num8 += 50;
                                }
                            }
                        }
                    }
                    int num16 = num8 / num3;
                    if (num16 < 10)
                    {
                        builder.Append("#");
                    }
                    else if (num16 < 17)
                    {
                        builder.Append("@");
                    }
                    else if (num16 < 24)
                    {
                        builder.Append("&");
                    }
                    else if (num16 < 31)
                    {
                        builder.Append("$");
                    }
                    else if (num16 < 38)
                    {
                        builder.Append("%");
                    }
                    else if (num16 < 45)
                    {
                        builder.Append("|");
                    }
                    else if (num16 < 52)
                    {
                        builder.Append("!");
                    }
                    else if (num16 < 59)
                    {
                        builder.Append(";");
                    }
                    else if (num16 < 66)
                    {
                        builder.Append(":");
                    }
                    else if (num16 < 73)
                    {
                        builder.Append("'");
                    }
                    else if (num16 < 80)
                    {
                        builder.Append("`");
                    }
                    else if (num16 < 87)
                    {
                        builder.Append(".");
                    }
                    else
                    {
                        builder.Append(" ");
                    }
                }
                builder.Append("\n");
            }
            image.Dispose();
            return builder.ToString();
        }

附:图片转ASCII图案: 图片转ASCII图案_刨坟专员的博客-CSDN博客_ascii图案

C# 将图片字符化(转为ASCII字符)相关推荐

  1. matlab报错问题处理,函数或变量无法识别,不受支持的符号、不可见的字符或非 ASCII 字符的粘贴———卸载之前

    matlab报错问题处理,, 文本字符无效.请检查不受支持的符号.不可见的字符或非 ASCII 字符的粘贴. matlab里面缺少自带函数处理办法: 1.比较好的方法是重装. 2.也可以缺哪个文件,就 ...

  2. c语言中时间字符化,C语言字符画,字符闪画.doc

    C语言字符画,字符闪画.doc (32页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 星星图#include #include #de ...

  3. 字符与字符串的表示(ASCII字符,Unicode码,字符串)

    非数值数据,通常指的是字符.字符串.图形符号.汉字等数据,它们并不用来表示数值的大小,一般情况下也不对它们进行算术运算. 1. ASCII字符 由于计算机内部只能识别和处理二进制代码,所以字符必须按照 ...

  4. python字符编码讲解_python 字符编码讲解

    ASCII控制字符  Unicode编码 ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁字 ...

  5. java图片转ascii字符画(转载)

    弄了一下午,始终不能得到较好的效果 主要是计算灰度值,再计算出对应字符 灰度值计算方法: 效果: 原图: 代码 package com.j;import com.sun.jndi.toolkit.ur ...

  6. java实现将图片转换成ascii字符文本图像

    基本原理 实现原理比较简单,计算图像中像素的灰度值,使用一些ascii字符,如"@#&$%*o!;.",粗略代表几个梯度的灰度值,根据灰度值计算需要填充的ASCII字符,假 ...

  7. 20行Python代码实现视频字符化

    来源 | ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触 ...

  8. html用转义字符画菱形,JavaScript生成字符画(ASCII Art)

    今天玩一些新的东西,大家都没有看过这样的视频: 或者 这样的图片: 网上有很多生成这种图片/视频的工具,但是每个程序员都有一颗造轮子的心,我们当然要玩出自己的花样啦.老规矩,还是先讲原理,建议先用自己 ...

  9. opencv画框返回坐标 python_20行Python代码实现视频字符化

    来源 | ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触 ...

最新文章

  1. 自动驾驶软件工程之预测
  2. 非常好用的网站状态监控服务:SiteUpTime,监控你的Http/Mail/Ping etc.
  3. 基于OpenCV高斯模型的公共场景人流量统计
  4. 排序算法(3)----归并排序
  5. mysql数据库用doc命令_MySQl数据库常用的DOS命令
  6. Linux脏牛漏洞提权复现
  7. Python进阶(六)文件操作
  8. 初窥JQuery-Jquery简介
  9. 史上最便捷搭建 Zookeeper 的方法!
  10. How to tie your shoes [by:姚铭]
  11. 前端代码更新镜像后,浏览器显示缓存
  12. JS汉字转拼音带音标
  13. html表格内数据填充颜色,点击数据,自动为整行表格填充颜色,再也不用担心看错数据了...
  14. 《西部世界》后续,研究人类学能让AI拥有灵魂?
  15. Openwrt 下 L2TP搭建
  16. 多个视频合成一个视频(带合成工具)
  17. realme支持鸿蒙系统,骁龙888+首批搭载安卓12,realme真我GT真香售价2499元起
  18. Chinese Segmentation Introduction
  19. linux中php是什么指令,什么是linux命令
  20. 什么是双因素验证 2FA,如何用 Python 实现?

热门文章

  1. MySQL数据库集群实战(1)——MySQL数据库基础知识
  2. 中文Stable Diffusion模型太乙使用教程
  3. 基于Java毕业设计智能化车辆管理综合信息平台源码+系统+mysql+lw文档+部署软件
  4. iphone8投屏电脑 苹果投屏电视的方法
  5. 软考高级(信息系统项目管理师)高频考点:项目质量管理
  6. 若依前后端分离框架学习-6:日志管理
  7. 2020-8-25 吴恩达DL学习-C4 卷积神经网络-第二周 CNN实例探究(2.7Inception 网络)
  8. 浅谈对Python的理解和优缺点
  9. app提示已到期_打开用友软件,提示演示期已到期。
  10. (2)3DMAX之基础对象创建