C#将图片转换成字符画


先看一下效果图

在Main方法中调用(首先要添加程序集System.Drawing,然后引入命名空间System.Drawing)

ConvertToChar(new Bitmap(@"D:\img\dlrb.png"), @"D:\1.txt", 2, 3);
Console.WriteLine("Success");

方法,这说一下,因为大图片像素的宽和高都是1000以上的,所以每一个转换为字符的话,会变得很宽,所以后两个参数是指定宽度和高度缩小WAddNum和HAddNum倍

/// <summary>
/// 将图片转换为字符画
/// </summary>
/// <param name="bitmap">Bitmap类型的对象</param>
/// <param name="savaPath">保存路径</param>
/// <param name="WAddNum">宽度缩小倍数(如果输入3,则以1/3倍的宽度显示)</param>
/// <param name="HAddNum">高度缩小倍数(如果输入3,则以1/3倍的高度显示)</param>
public static void ConvertToChar(Bitmap bitmap, String savaPath, int WAddNum, int HAddNum) {
    StringBuilder sb = new StringBuilder(); String replaceChar = "@*#$%XB0H?OC7>+v=~^:_-'`. "; for (int i = 0; i < bitmap.Height; i += HAddNum) { for (int j = 0; j < bitmap.Width; j += WAddNum) { //获取当前点的Color对象 Color c = bitmap.GetPixel(j, i); //计算转化过灰度图之后的rgb值(套用已有的计算公式就行) int rgb = (int)(c.R * .3 + c.G * .59 + c.B * .11); //计算出replaceChar中要替换字符的index //所以根据当前灰度所占总rgb的比例(rgb值最大为255,为了防止超出索引界限所以/256.0) //(肯定是小于1的小数)乘以总共要替换字符的字符数,获取当前灰度程度在字符串中的复杂程度 int index = (int)(rgb / 256.0 * replaceChar.Length); //追加进入sb  sb.Append(replaceChar[index]); } //添加换行 sb.Append("\r\n"); } //创建文件流 using (FileStream fs = new FileStream(savaPath, FileMode.Create, FileAccess.Write)) { //转码 byte[] bs = Encoding.Default.GetBytes(sb.ToString()); //写入 fs.Write(bs, 0, bs.Length); } }

 其是内部的原理就是循环遍历图片的每一个像素点,然后根据计算公式计算出该点的灰度值(计算公式 R*0.3+G*0.59+B*0.11 ),计算出来之后查看占总值(255)的多少,结果肯定不足1,因为计算出来的值最大为255,然后接下来就是查找对应的字符,其实字符根据复杂的程度已经排好序了,有几个字符就是将255分成几份,比如这里就是将字符分成了26份,用计算出来的小数✖总字符的长度找到。

举个例子:例如rgb值都为255,计算出来灰度的值也为255,然后除以256.0,此时结果是一个小数0.99....,然后在✖26,结果是25.74....,转换为int之后为索引为25,刚好是最后一位。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM