Click here to Skip to main content
15,867,488 members
Articles / Web Development / ASP.NET

ASCII art with C#

Rate me:
Please Sign up or sign in to vote.
4.85/5 (78 votes)
30 Jan 2005CPOL1 min read 453K   9.6K   189   53
About writing an image to ASCII converter.

Sample Image - ascii_art_with_c_.jpg

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#.

Step 1: The Upload Form.

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

C#
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:

C#
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.

C#
Rectangle bounds = 
 new Rectangle(0, 0, _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.

C#
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.

C#
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:

C#
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.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Germany Germany
Beginning of the nineties started to assemble computers and configure networks. Automation lead to batching and scripting. Arrived on the other side of the trench the HTTP protocol is a constant companion. the journey began with JavaScript, then Perl, PHP and ASP with Visual Basic 5 and JScript, ending with Java and C++. End of the nineties starting to focus .NET, streaked Python, and now JavaScript again. He develops, teaches, trains, coaches and speaks. His topics: HTML5 & Web, Data Access & Performance, Scalable & Testable Designs, Distributed Systems & Services, Security & Trust.

Comments and Discussions

 
GeneralA little typo in your code Pin
Eirik18-Jan-05 20:46
Eirik18-Jan-05 20:46 
GeneralRe: A little typo in your code Pin
Daniel Fisher (lennybacon)18-Jan-05 22:15
Daniel Fisher (lennybacon)18-Jan-05 22:15 
Questionhow about html conversion Pin
Member 357484512-Jan-05 22:53
Member 357484512-Jan-05 22:53 
AnswerRe: how about html conversion Pin
Matthew Hanna26-Jun-05 8:09
Matthew Hanna26-Jun-05 8:09 
GeneralRe: how about html conversion Pin
Matthew Hanna26-Jun-05 13:50
Matthew Hanna26-Jun-05 13:50 
Questionhow about html conversion Pin
nokiko12-Jan-05 22:53
nokiko12-Jan-05 22:53 
GeneralVery cool btw: I ported it to VB.net Pin
5-Jan-05 20:45
suss5-Jan-05 20:45 
GeneralRe: Very cool btw: I ported it to VB.net Pin
Daniel Fisher (lennybacon)6-Jan-05 0:30
Daniel Fisher (lennybacon)6-Jan-05 0:30 
Last line of ASCII or Code? Do you like to send me the VB version?

# THIS CODE AND INFORMATION ARE PROVIDED
# "AS IS" WITHOUT WARRANTY OF ANY
# KIND, EITHER EXPRESSED OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO THE
# IMPLIED WARRANTIES OF MERCHANTABILITY
# AND/OR FITNESS FOR A PARTICULAR PURPOSE.
# http://www.lennybacon.com/
GeneralRe: Very cool btw: I ported it to VB.net Pin
Paul Farry6-Jan-05 8:17
professionalPaul Farry6-Jan-05 8:17 
GeneralRe: Very cool btw: I ported it to VB.net Pin
Anonymous20-Jan-05 13:31
Anonymous20-Jan-05 13:31 
GeneralRe: Very cool btw: I ported it to VB.net Pin
Daniel Fisher (lennybacon)21-Jan-05 0:08
Daniel Fisher (lennybacon)21-Jan-05 0:08 
GeneralRe: Very cool btw: I ported it to VB.net Pin
Daniel Fisher (lennybacon)14-May-07 22:48
Daniel Fisher (lennybacon)14-May-07 22:48 
GeneralFun Pin
Mike Ellison5-Jan-05 7:45
Mike Ellison5-Jan-05 7:45 
GeneralOk, this is just cool.... Pin
webguy5531-Dec-04 11:29
webguy5531-Dec-04 11:29 
GeneralRe: Ok, this is just cool.... Pin
Daniel Fisher (lennybacon)2-Jan-05 21:53
Daniel Fisher (lennybacon)2-Jan-05 21:53 
GeneralIf you like theese Pin
jumacabo29-Dec-04 4:15
jumacabo29-Dec-04 4:15 
GeneralYou were MSDN-blogged :-) Pin
Uwe Keim28-Dec-04 17:45
sitebuilderUwe Keim28-Dec-04 17:45 
GeneralRe: You were MSDN-blogged :-) Pin
Daniel Fisher (lennybacon)29-Dec-04 6:29
Daniel Fisher (lennybacon)29-Dec-04 6:29 
Questionhow to install it? Pin
Prakash Nadar27-Dec-04 21:48
Prakash Nadar27-Dec-04 21:48 
AnswerRe: how to install it? Pin
Daniel Fisher (lennybacon)28-Dec-04 0:37
Daniel Fisher (lennybacon)28-Dec-04 0:37 
GeneralWhy not include the project file? Pin
Steven Fowler28-Dec-04 3:36
Steven Fowler28-Dec-04 3:36 
GeneralRe: Why not include the project file? Pin
Daniel Fisher (lennybacon)28-Dec-04 14:49
Daniel Fisher (lennybacon)28-Dec-04 14:49 
GeneralRe: Why not include the project file? Pin
Steven Fowler29-Dec-04 5:40
Steven Fowler29-Dec-04 5:40 
GeneralRe: Why not include the project file? Pin
Daniel Fisher (lennybacon)29-Dec-04 6:35
Daniel Fisher (lennybacon)29-Dec-04 6:35 
GeneralCool one!!! Pin
Rajesh Pillai27-Dec-04 4:33
Rajesh Pillai27-Dec-04 4:33 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.