做的一个ascii_art demo
思路很简单,将每个像素点取得的值,映射到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 } }