Click here to Skip to main content
12,077,753 members (47,880 online)
Click here to Skip to main content
Add your own
alternative version

Stats

362.9K views
7.3K downloads
178 bookmarked
Posted

ASCII art with C#

, 31 Jan 2005 CPOL
Rate this:
Please Sign up or sign in to vote.
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#.

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

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.

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:

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)

Share

About the Author

Daniel Fisher (lennybacon)
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.

You may also be interested in...

Comments and Discussions

 
Bugbroken link to see example Pin
_Noctis_20-Dec-15 17:32
professional_Noctis_20-Dec-15 17:32 
GeneralMy vote of 5 Pin
conscab18-Jan-13 2:31
memberconscab18-Jan-13 2:31 
GeneralRe: My vote of 5 Pin
Daniel Fisher (lennybacon)18-Jan-13 3:26
memberDaniel Fisher (lennybacon)18-Jan-13 3:26 
QuestionHELP me what to do next Pin
Member 97233272-Jan-13 8:54
memberMember 97233272-Jan-13 8:54 
QuestionHELP Pin
Member 97233272-Jan-13 8:53
memberMember 97233272-Jan-13 8:53 
AnswerRe: HELP Pin
Daniel Fisher (lennybacon)18-Jan-13 3:26
memberDaniel Fisher (lennybacon)18-Jan-13 3:26 
Generalthe best Pin
Evgeniy_9213-Oct-10 11:27
memberEvgeniy_9213-Oct-10 11:27 
GeneralYour application in Window Form flavor! Pin
E! Ray K10-Sep-08 11:24
memberE! Ray K10-Sep-08 11:24 
GeneralAnother approach... Pin
Doodie Woddy Doodlechips16-Mar-08 4:51
memberDoodie Woddy Doodlechips16-Mar-08 4:51 
QuestionHow to convert from Ascii to Image [modified] Pin
naveensri13-Jul-06 3:12
membernaveensri13-Jul-06 3:12 
GeneralGrayscale, GetPixel method confusion Pin
allapg21-Jun-05 18:08
memberallapg21-Jun-05 18:08 
GeneralRe: Grayscale, GetPixel method confusion Pin
Daniel Fisher (lennybacon)22-Jun-05 0:23
memberDaniel Fisher (lennybacon)22-Jun-05 0:23 
GeneralRe: Grayscale, GetPixel method confusion Pin
Daniel Fisher (lennybacon)22-Jun-05 0:24
memberDaniel Fisher (lennybacon)22-Jun-05 0:24 
GeneralRe: Grayscale, GetPixel method confusion Pin
allapg22-Jun-05 19:02
memberallapg22-Jun-05 19:02 
GeneralRe: Grayscale, GetPixel method confusion Pin
Daniel Fisher (lennybacon)23-Jun-05 3:39
memberDaniel Fisher (lennybacon)23-Jun-05 3:39 
GeneralCrop Image Pin
aaccoobb31-Mar-05 1:15
memberaaccoobb31-Mar-05 1:15 
GeneralRe: Crop Image Pin
Daniel Fisher (lennybacon)22-Jun-05 0:25
memberDaniel Fisher (lennybacon)22-Jun-05 0:25 
QuestionWhat kind of methods? Pin
Snowjade2-Mar-05 17:03
memberSnowjade2-Mar-05 17:03 
AnswerRe: What kind of methods? Pin
Daniel Fisher (lennybacon)3-Mar-05 22:34
memberDaniel Fisher (lennybacon)3-Mar-05 22:34 
GeneralAn improvement... Pin
Miguel Lopes14-Feb-05 1:26
memberMiguel Lopes14-Feb-05 1:26 
GeneralNow this is just too cool! Pin
GISnet29-Jan-05 20:19
memberGISnet29-Jan-05 20:19 
GeneralBeautiful program Pin
Phan Dung27-Jan-05 16:25
memberPhan Dung27-Jan-05 16:25 
GeneralNice and can be perfect Pin
kawzaki25-Jan-05 18:32
memberkawzaki25-Jan-05 18:32 
GeneralRe: Nice and can be perfect Pin
Daniel Fisher (lennybacon)26-Jan-05 2:15
memberDaniel Fisher (lennybacon)26-Jan-05 2:15 
kawzaki wrote:
i would like to test the VB.net version too.

Me to.

kawzaki wrote:
for a first thought, in .net applications made in different langages shall have no speed difference since all are compiled and translated to Microsoft ML.

year but ho it is translated matters, eh.

thx,

Daniel



# 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/
Generaladd in install Pin
Pyro Joe22-Jan-05 17:49
memberPyro Joe22-Jan-05 17:49 

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.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.160212.1 | Last Updated 31 Jan 2005
Article Copyright 2004 by Daniel Fisher (lennybacon)
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid