zoukankan      html  css  js  c++  java
  • 做的一个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
        }
    }
  • 相关阅读:
    uva-11129-分治
    HDU 6016
    POJ 2142
    CodeForces 778B
    CodeFroces 758C
    HDU 5900
    HDU 5903
    HDU 5904
    POJ 3080
    HDU 5195
  • 原文地址:https://www.cnblogs.com/seebro/p/2533098.html
Copyright © 2011-2022 走看看