[译文]ASCII art with C#

 

ASCII art with C#

    翻译说明:原文版权归作者所有

    原文作者:Daniel Fisher (lennybacon)

    原文地址:http://www.codeproject.com/aspnet/ascii_art_with_c_.asp

           :zitiger http://zitiger.cnblogs.com/


Introduction (
介绍)

Behind the scenes: I like C# and I like ASCII art. So I asked myself if somebody has written some image to ASCII application in C#. I Googled but found nothing. I did image manipulation stuff for my company and so I decided to build a basic image-to-ASCII conversion library in C#.

背景:我喜欢C#ASCII 艺术,所以试图知道是不是已经有人使用C#写了把图像转换成ASCII的应用.Google了一下,没有发现.在公司我从事图像处理素材,所以我决定写一个把图像转换成ASCII的基本类库.

You can see a running sample here.

你能在这里看到一个运行着的例子.(译者注:我没有能够打开这个页面.)

Step 1: The Upload Form. (第一步 上传表单)

To keep it quite simple, I just check the content type and let my library do the rest.

简单起见,我只检查了上传文件的类型,其他的就交给我的类库去完成了.

if(File1.PostedFile.ContentType=="image/gif" ||
    File1.PostedFile.ContentType
=="image/jpg" ||
    File1.PostedFile.ContentType
=="image/jpeg" ||
    File1.PostedFile.ContentType
=="image/pjpeg" ||
    File1.PostedFile.ContentType
=="image/bmp")
   {
        Output.Text 
= "<xmp>" +
        StaticDust.AsciiArt.ConvertImage(
         File1.PostedFile.InputStream) 
+
        
"</xmp>";
   }
   
else
   {
        



Step 2: The Library(第二步 类库)

The first thing I do is of course load the image:

首先,当然是加载图片.

Image _img = Image.FromStream(stream);

Bitmap _image 
= 

 
new Bitmap(_img, new Size(_img.Width, _img.Height));

_img.Dispose();

Next I grayscale the image - you'll see later why.

接着我把图片灰度化-过会你就知道为什么要这么做了. 

Rectangle bounds = 

 
new Rectangle(00, _image.Width, _image.Height);

 

ColorMatrix _matrix 
= new ColorMatrix();

_matrix[
0,0= 1/3f;

_matrix[
0,1= 1/3f;

_matrix[
0,2= 1/3f;

_matrix[
1,0= 1/3f;

_matrix[
1,1= 1/3f;

_matrix[
1,2= 1/3f;

_matrix[
2,0= 1/3f;

_matrix[
2,1= 1/3f;

_matrix[
2,2= 1/3f;

 

ImageAttributes _attributes 
= 

 
new ImageAttributes();

_attributes.SetColorMatrix(_matrix);

 

Graphics gphGrey 
= Graphics.FromImage(_image);

gphGrey.DrawImage(_image, 

 bounds, 

 
0

 
0

 _image.Width, 

 _image.Height,

 GraphicsUnit.Pixel, 

 _attributes);

 

gphGrey.Dispose();

O.K. Now, we get to the interesting part.

好了,现在我们就要进入最有意思的部分了.



for(int h=0; h<_image.Height/10; h++)
{
    
int _startY = (h*10);

    
for(int w=0; w<_image.Width/5; w++)
    {
         
int _startX = (w*5);
         
int _allBrightness = 0;
         


I loop through the image's pixels and because I don't want one ASCII character per pixel, I take one per 10/5. To let every pixel influence the resulting ASCII char, I loop them and calculate the brightness of the amount.

我对图片的像素进行循环,我不想一个ASCII字符代表一个像素,而是代表10/5(像素).为了让每个

像素效果都能在最终结果的ASCII字符里有所体现,我对代表一个ASCII字符的一组像素进行循环,然后计算它们的亮度和.

(译者:把图片上的所有像素按一定的大小分成N小块,再求出每一小块内所有像素的亮度和.)

for(int y=0; y<10; y++)

{

    
for(int x=0; x<10; x++)

    {

        
int _cY = y + _startY;

        
int _cX = x + _startX;

        
try

        {

            Color _c 
= _image.GetPixel(_cX, _cY);

            
int _b = (int)(_c.GetBrightness() * 10);

            _allBrightness 
= (_allBrightness + _b);

        }

        
catch

        {

            _allBrightness 
= (_allBrightness + 10);

        }

        

Finally, I append different ASCII characters based on the calculated amount:

最后,我根据计算出来的和把不同的ASCII字符组合起来.

int _sb = (_allBrightness/10);
if(_sb<25)
{
    _asciiart.Append(
"#");
}
else if(_sb<30)
{
    



That's all

Thanks to The Code Project and Chris Maunder, newtelligence and greetings to all C# coders out there.

感谢Code Project , Chris Maunder newtelligence,并向所有C#爱好者问好.

 

译者的理解:

1.        通过Web上传一张图片;

2.        把图片进行灰度化(变成黑白);

3.        把图片划分成N个小块,对每个小块的内像素的亮度进行求和;

4.         根据每个小块的亮度平均值来选择合适的ASCII字符进行组合;

5.         输出.

 

 

欢迎杭州的朋友加入杭州.net俱乐部http://zitiger.cnblogs.com/archive/2005/07/28/201584.html.

:马上大四了,找个实习单位,个人简历http://zitiger.cnblogs.com/archive/2005/07/26/200648.html,限杭州.

原文地址:https://www.cnblogs.com/zitiger/p/203083.html