C# 将图片字符化(转为ASCII字符)
一、老规矩,先看效果:
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字符)相关推荐
- matlab报错问题处理,函数或变量无法识别,不受支持的符号、不可见的字符或非 ASCII 字符的粘贴———卸载之前
matlab报错问题处理,, 文本字符无效.请检查不受支持的符号.不可见的字符或非 ASCII 字符的粘贴. matlab里面缺少自带函数处理办法: 1.比较好的方法是重装. 2.也可以缺哪个文件,就 ...
- c语言中时间字符化,C语言字符画,字符闪画.doc
C语言字符画,字符闪画.doc (32页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 星星图#include #include #de ...
- 字符与字符串的表示(ASCII字符,Unicode码,字符串)
非数值数据,通常指的是字符.字符串.图形符号.汉字等数据,它们并不用来表示数值的大小,一般情况下也不对它们进行算术运算. 1. ASCII字符 由于计算机内部只能识别和处理二进制代码,所以字符必须按照 ...
- python字符编码讲解_python 字符编码讲解
ASCII控制字符 Unicode编码 ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)是基于拉丁字 ...
- java图片转ascii字符画(转载)
弄了一下午,始终不能得到较好的效果 主要是计算灰度值,再计算出对应字符 灰度值计算方法: 效果: 原图: 代码 package com.j;import com.sun.jndi.toolkit.ur ...
- java实现将图片转换成ascii字符文本图像
基本原理 实现原理比较简单,计算图像中像素的灰度值,使用一些ascii字符,如"@#&$%*o!;.",粗略代表几个梯度的灰度值,根据灰度值计算需要填充的ASCII字符,假 ...
- 20行Python代码实现视频字符化
来源 | ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触 ...
- html用转义字符画菱形,JavaScript生成字符画(ASCII Art)
今天玩一些新的东西,大家都没有看过这样的视频: 或者 这样的图片: 网上有很多生成这种图片/视频的工具,但是每个程序员都有一颗造轮子的心,我们当然要玩出自己的花样啦.老规矩,还是先讲原理,建议先用自己 ...
- opencv画框返回坐标 python_20行Python代码实现视频字符化
来源 | ZackSock(ID:ZackSock) 我们经常在B站上看到一些字符鬼畜视频,主要就是将一个视频转换成字符的样子展现出来. 看起来是非常高端,但是实际实现起来确实非常简单,我们只需要接触 ...
最新文章
- 自动驾驶软件工程之预测
- 非常好用的网站状态监控服务:SiteUpTime,监控你的Http/Mail/Ping etc.
- 基于OpenCV高斯模型的公共场景人流量统计
- 排序算法(3)----归并排序
- mysql数据库用doc命令_MySQl数据库常用的DOS命令
- Linux脏牛漏洞提权复现
- Python进阶(六)文件操作
- 初窥JQuery-Jquery简介
- 史上最便捷搭建 Zookeeper 的方法!
- How to tie your shoes [by:姚铭]
- 前端代码更新镜像后,浏览器显示缓存
- JS汉字转拼音带音标
- html表格内数据填充颜色,点击数据,自动为整行表格填充颜色,再也不用担心看错数据了...
- 《西部世界》后续,研究人类学能让AI拥有灵魂?
- Openwrt 下 L2TP搭建
- 多个视频合成一个视频(带合成工具)
- realme支持鸿蒙系统,骁龙888+首批搭载安卓12,realme真我GT真香售价2499元起
- Chinese Segmentation Introduction
- linux中php是什么指令,什么是linux命令
- 什么是双因素验证 2FA,如何用 Python 实现?
热门文章
- MySQL数据库集群实战(1)——MySQL数据库基础知识
- 中文Stable Diffusion模型太乙使用教程
- 基于Java毕业设计智能化车辆管理综合信息平台源码+系统+mysql+lw文档+部署软件
- iphone8投屏电脑 苹果投屏电视的方法
- 软考高级(信息系统项目管理师)高频考点:项目质量管理
- 若依前后端分离框架学习-6:日志管理
- 2020-8-25 吴恩达DL学习-C4 卷积神经网络-第二周 CNN实例探究(2.7Inception 网络)
- 浅谈对Python的理解和优缺点
- app提示已到期_打开用友软件,提示演示期已到期。
- (2)3DMAX之基础对象创建