C# Ascii Art Tutorial

If you got here, you probably want to know how Ascii Art works and how to use C# to transform images into text. We’ll do this by making good use of LockBits() and UnlockBits(), and also, a pointer – going unsafe !
I know those make everything more complicated, but they’re more efficient.

How does an Ascii Art generator work?

• first, it opens the Image and resizes it to a custom size (about 100×100)

• using 2 loops and a pointer, it gets the color of each pixel in the image (the image, stored in memory, looks like a two-dimensional array of pixels)

• for each pixel, it adds a character into a text file, depending on the alpha (transparency)

Now if you got a basic idea about how this works, you can build your own program – no need to worry about the source code, you’ll find everything here, including the necessary explainations.
Start by creating a Forms Project, make sure you have checked Allow unsafe code from Project->Properties->Build.
In form1_load add the following line to load the image from the executable’s directory:
Then, we transform this image into a Bitmap, and resize it to 100×100 pixels – don’t use HD images there, because it will take some time to check every pixel:
Now we need a StringBuilder in which we store the characters corresponding to the image’s pixels.
Update: as Alex Stuart pointed out, it is more efficient to use a StringBuilder instead of a string (why ?).

1.From Pixel to Char

As I said, we’ll use those 2 functions :
LockBits() – locks the image in the system’s memory so we can directly get pixel’s attributes by using a pointer
UnlockBits() – releases the memory used
As you know, an image is created by a group of pixels and each pixel takes 4 bytes of memory, that means it has 4 properties: Red, Green, Blue and Alpha/transparency. From the memory we can read each pixel’s property.
Each pixel must be transformed into a character with the same color and all the characters must be the same width and height (monospaced) so we maintain the aspect ratio.

2.Choosing the right character

There’s a function in the code above that I’ll explain here: getAsciiChar(). What it does? It returns a character depending on the transparency of the current pixel (so it looks like true ascii art).

3.Displaying the Ascii-Art

Now we just have to display our image, which is easily done using this:
Finally, we get this:
Previous
Next Post »