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