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,刚好是最后一位。
C#将图片转换成字符画的更多相关文章
- HTML5将图片转化成字符画
HTML5将图片转化成字符画 字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置 ...
- 基于 canvas 将图片转化成字符画
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢? HTML5 让这个可能变成了现实,通过 canvas,可以很轻松实现这个功能. 其实原理很简单:扫描图片相应位置的像素点,再计算出其灰 ...
- 基于canvas将图片转化成字符画
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置的像素点,再计算出其灰度值,根 ...
- 第一个Python小项目:图片转换成字符图片
实现的效果: ...
- Java实现把图片转成字符画
1,先看效果图:
- 将图片转为ASCII字符画
原文:将图片转为ASCII字符画 Copyright 2012 Conmajia 源代码下载:点击这里 什么是字符画?就是用ASCII字符来近似组成图像,就像这样: ╭╮ ╭╮ ││ ││ ╭┴┴—— ...
- AsciiPic Java视频转成字符画
AsciiPic Java视频转成字符画 github下载 https://github.com/dejavudwh/AsciiPic 运行截图 //没有做GUI 比较简陋 节省时间 main里的文件 ...
- 运用C语言将图片转换成16进制的字符串(base64)
最近在写手机端的性能测试脚本的时候,发现手机在上传图片数据时,先将图片转换成一堆16进制的字符,将字符传输过去,服务器再将字符解码成图片 我们在loadrunner中测试时,就需要用C语言将图片编码. ...
- 使用CSS将图片转换成黑白(灰色、置灰)z转
小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...
随机推荐
- 谷歌浏览器 Google Chrome 70.0.3538.102 便携版
oogle Chrome 是由Google开发的一款设计简单.运行高效.支持扩展的浏览器,它基于高速WebKit/Blink内核和高性能JavaScript V8引擎,在支持多标签浏览的基础上,提供顺 ...
- vue源码阅读(二)
一 一个实例 如果简单了解过些Vue的API的话,肯定会对一下这个特别熟悉,在上一篇里,分析了Vue的核心文件core的index.js构造vue函数执行的流程. 那么下边这个则是实例化构造函数,也就 ...
- NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load xxxx错误解决方法
在开发项目的过程中,和后端对接,我们使用是一个成熟的集成很全面的架构JHipster.后端为java spring-boot 前端ts+react,需求是有一个需要在页面里嵌套iframe的需求.然后 ...
- 1.jdk1.7到jdk1.8 Map发生了什么变化(底层)?
1.8之后hashMap的数据结构发生了变化,从之前的单纯的数组+链表结构变成数组+链表+红黑树.也就是说在JVM存储hashMap的K-V时仅仅通过key来决定每一个entry的存储槽位(Node[ ...
- 分享基于EF6、Unitwork、Autofac的Repository模式设计
目录 分享基于EF6.Unitwork.Autofac的Repository模式设计 一.实现的思路和结构图 二.Repository设计具体的实现代码 三.Repository设计的具体的使用 四. ...
- python基础知识六 文件的基本操作+菜中菜
基础知识六 文件操作 open():打开 file:文件的位置(路径) mode:操作文件模式 encoding:文件编码方式 f :文件句柄 f = open("1.t ...
- C#7.2 新增功能
连载目录 [已更新最新开发文章,点击查看详细] C# 7.2 又是一个单点版本,它增添了大量有用的功能. 此版本的一项主要功能是避免不必要的复制或分配,进而更有效地处理值类型. C# 7.2 使 ...
- Git学习笔记 (二)
Git学习笔记(二) 突然发现,学习新知识新技能,都得经常温故使用,这样才能日益精进.最近学习的Git是因为加入了课题组,在学习做一些后台,由于后台开发会牵扯到多人开发,所以学会Git这一代码管理工具 ...
- 在父页面用Iframe加载子页面时,将父页面的title替换成子页面title
报告管理
- golang从context源码领悟接口的设计
注:写帖子时go的版本是1.12.7 go语言中实现一个interface不用像其他语言一样需要显示的声明实现接口.go语言只要实现了某interface的方法就可以做类型转换.go语言没有继承的概念 ...