先看一下效果图

在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,刚好是最后一位。

C#将图片转换成字符画的更多相关文章

  1. HTML5将图片转化成字符画

    HTML5将图片转化成字符画 字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置 ...

  2. 基于 canvas 将图片转化成字符画

    字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢? HTML5 让这个可能变成了现实,通过 canvas,可以很轻松实现这个功能. 其实原理很简单:扫描图片相应位置的像素点,再计算出其灰 ...

  3. 基于canvas将图片转化成字符画

    字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置的像素点,再计算出其灰度值,根 ...

  4. 第一个Python小项目:图片转换成字符图片

    实现的效果:                                                                                               ...

  5. Java实现把图片转成字符画

    1,先看效果图:

  6. 将图片转为ASCII字符画

    原文:将图片转为ASCII字符画 Copyright 2012 Conmajia 源代码下载:点击这里 什么是字符画?就是用ASCII字符来近似组成图像,就像这样: ╭╮ ╭╮ ││ ││ ╭┴┴—— ...

  7. AsciiPic Java视频转成字符画

    AsciiPic Java视频转成字符画 github下载 https://github.com/dejavudwh/AsciiPic 运行截图 //没有做GUI 比较简陋 节省时间 main里的文件 ...

  8. 运用C语言将图片转换成16进制的字符串(base64)

    最近在写手机端的性能测试脚本的时候,发现手机在上传图片数据时,先将图片转换成一堆16进制的字符,将字符传输过去,服务器再将字符解码成图片 我们在loadrunner中测试时,就需要用C语言将图片编码. ...

  9. 使用CSS将图片转换成黑白(灰色、置灰)z转

    小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...

随机推荐

  1. S7-300CPU存储器介绍及存储卡使用

    1. S7 300存储区概述 S7-300 PLC的存储区可以划分为四个区域:装载存储器(Load Memory).工作存储器(Work Memory). 系统存储器(System Memory)和保 ...

  2. div+css 布局技巧总计

    一.css 样式 1.float 首先需要了解块级元素(block element).每个块级元素都默认占用一行,在同一行只能添加一个块元素(float 除外).块级元素一般可以嵌套块级元素或者行内元 ...

  3. Spring Cloud Alibaba | 序言

    目录 Spring Cloud Alibaba | 序言 1. Spring Cloud Alibaba是什么? 2. 主要功能 3. 组件 4. 版本说明 4.1 版本依赖关系 4.2 组件版本关系 ...

  4. c++学习书籍推荐《C标准库(英文版)》下载

    <C标准库(英文版)>是由世界级C语言专家编写的C标准库经典著作,影响了几代程序员. <C标准库(英文版)>集中讨论了C标准库,全面介绍了ANSI/ISO C语言标准的所有库函 ...

  5. windows美化工具7+ Taskbar Tweaker

    今天分享一个windows美化工具 7+ Taskbar Tweaker 调整工具专为 Windows 任务栏工作者量身定制,支持 Windows 7 以及更高版本的(非服务器版)微软操作系统平台. ...

  6. [ZJOI2008]杀蚂蚁antbuster 题解

    一个题目的可读版本:https://www.zybuluo.com/Jerusalem/note/221811 这两天做的又一道大模拟题,感觉这玩意有毒,会上瘾啊…… 比起猪国杀这道题真心不知道高到哪 ...

  7. 20190127-Orleans与SF小伙伴的部分问答

    Orleans 怎么部署到服务器? 方式1:Orleans 服务端寄宿在Web应用中,将Web应用部署到服务器 方式2:通过SF/K8s部署到服务器 不同服务器上的谷仓和谷如何调配? 由Orleans ...

  8. 微信小程序开发--API界面交互

    一.wx:showActionSheet(上拉菜单) 属性 类型 默认值 必填 说明 itemList Array.<string>   是 按钮的文字数组,数组长度最大为 6 itemC ...

  9. 【NOIP2015】扫雷游戏-C++

    描述 扫雷游戏是一款十分经典的单机小游戏.在 n 行 m 列的雷区中有一些格子含有地雷 (称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时, 该格将会出现一个数字--提示周围 ...

  10. 列表 元组 range

    2019 年 7 月 9 日 列表---list------容器 列表:存储数据,支持多个数据类型,比如 :字符串 数字 布尔值 列表 集合 元组 ​ 特点 : 有序 可变 支持索引 (定义一个列表不 ...