思路很简单,将每个像素点取得的值,映射到ascii 表中,将取得的字符追加到字符串中,最终输出。
缺点是处理大图片时,会生成非常大的字符表,简单的用抽值和压缩图像弥补,但效果还是不容乐观,有更好的方法,欢迎沟通,互促互利!
主要代码如下:
#region 定义成员变量
private string file_name = "";
private string [] ascii_map = {"#", "b"," ", "d", "e","f"," ","*","-","k",".","l","m","n","o",
"p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
"P","Q","R","S","T","U","V","W","X","Y","Z",
"1","2","3","4","g","6","7","8","9","0", "5",
",","j","/","<",">","?","`","!","@","a","$","%","^","&","h","(",")","_","+",
"i","=","[","]"
};
private img_compress img_handle = new img_compress();
#endregion
#region 图片压缩
private Bitmap img_compress(Bitmap pic)
{
byte[] buffer = img_handle.ImageGdi(pic);
pic = img_handle.bytetobmp(buffer);
return pic;
}
#endregion
#region 按钮事件
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog image_file = new OpenFileDialog();
if (image_file.ShowDialog() == DialogResult.OK)
{
file_name = image_file.FileName;
pictureBox1.Image = Image.FromFile(file_name);
}
}
private void button2_Click(object sender, EventArgs e)
{
Color grey_color;
int average_color;
StringBuilder pic_text = new StringBuilder();
Bitmap pic = new Bitmap(file_name);
pic = img_compress(pic);
for (int i = 0; i < pic.Height; i = i + 3)
{
for (int j = 0; j < pic.Width; j = j + 2)
{
Color pixel = pic.GetPixel(j, i);
average_color = (pixel.R + pixel.G + pixel.B) / 3;
grey_color = Color.FromArgb(average_color, average_color, average_color);
pic_text.Append(ascii_map[(grey_color.R * 10) /255]);
}
pic_text.Append("\n");
}
richTextBox1.Text = pic_text.ToString();
}
#endregion
}
//IMG_COMPRESS.cs
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace IMG_COMPRESS
{
class img_compress
{
public img_compress()
{
;
}
#region Bitmap转换byte[]数组
public byte[] Bmptobyte(Bitmap bmp)
{
MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Jpeg);
ms.Flush();
byte[] buffer = ms.GetBuffer();
ms.Close();
return buffer;
}
#endregion
#region byte[]数组转换Bitmap
public Bitmap bytetobmp(byte[] buffer)
{
MemoryStream ms = new MemoryStream();
ms.Write(buffer, 0, buffer.Length);
Bitmap bmp = new Bitmap(ms);
ms.Close();
return bmp;
}
#endregion
#region GDI压缩图片
public byte[] ImageGdi(Bitmap bmp)
{
Bitmap xbmp = new Bitmap(bmp);
MemoryStream ms = new MemoryStream();
xbmp.Save(ms, ImageFormat.Jpeg);
byte[] buffer;
ms.Flush();
if (ms.Length > 95000)
{
buffer = ms.GetBuffer();
double new_width = 0;
double new_height = 0;
Image m_src_image = Image.FromStream(ms);
if (m_src_image.Width >= m_src_image.Height)
{
new_width = 1024;
new_height = new_width * m_src_image.Height / (double)m_src_image.Width;
}
else if (m_src_image.Height >= m_src_image.Width)
{
new_height = 768;
new_width = new_height * m_src_image.Width / (double)m_src_image.Height;
}
Bitmap bbmp = new Bitmap((int)new_width, (int)new_height, m_src_image.PixelFormat);
Graphics m_graphics = Graphics.FromImage(bbmp);
m_graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
m_graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
m_graphics.DrawImage(m_src_image, 0, 0, bbmp.Width, bbmp.Height);
ms = new MemoryStream();
bbmp.Save(ms, ImageFormat.Jpeg);
buffer = ms.GetBuffer();
ms.Close();
return buffer;
}
else
{
buffer = ms.GetBuffer();
ms.Close();
return buffer;
}
}
#endregion
}
}