none
C#中图片转二进制到存储数据库 RRS feed

  • 问题

  • 我现在时用Graphics自己画出来的图片,

    放在以个Image 对象中,

    我现在想把这个Image对象转换成可以存放到SQL SERVER 2005数据库的二进制,
    想问下怎么实现,最好有代码示例,
    在外边找的全是通过图片的文件没,用FileStream来操作的

    2009年10月22日 9:09

答案

  • public static byte[] ImgToByt(Image img)
            {
                MemoryStream ms = new MemoryStream();
                byte[] imagedata = null;
                img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                imagedata = ms.GetBuffer();
                return imagedata;            
            }

            public static Image BytToImg(byte[] byt)
            {
                MemoryStream ms = new MemoryStream(byt);
                Image img = Image.FromStream(ms);
                return img;
            }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 天驰 2009年10月22日 17:04
    2009年10月22日 9:26
    版主

全部回复

  • 下面是 ACCESS 的示例,SQL Server 你需要调整一下。字段类型可以设置为 Binary(max) 或 image
    /// <summary>
    /// 将指定的图片信息存入到 Access 数据库
    /// </summary>
    /// <param name="fImageName">图片名</param>
    /// <param name="fImageBinary">图片的 Byte</param>
    public void InsertImageToAccess(String fImageName, Byte[] fImageBinary)
    {
        // Access 表
        // 字段
        // ImageName 文本
        // ImageBinary OLE 对象
        using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\X.mdb")) {
            OleDbCommand fInsertCommand = new OleDbCommand();
            fInsertCommand.Connection = conn;
            fInsertCommand.CommandText = "INSERT INTO Images (ImageName, ImageBinary) values (?, ?)";
            fInsertCommand.Parameters.Add("@ImageName", OleDbType.VarChar).Value = fImageName;
            fInsertCommand.Parameters.Add("@ImageBinary", OleDbType.Binary, fImageBinary.Length).Value = fImageBinary;
           
            conn.Open();
            fInsertCommand.ExecuteNonQuery();
        }
    }
    /// <summary>
    /// 获取指定图片名的 Byte
    /// </summary>
    /// <param name="fImageName">图片名</param>
    /// <returns></returns>
    public Byte[] GetImageFromAccess(String fImageName)
    {
        using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\X.mdb")) {
            OleDbCommand fSelectCommand = new OleDbCommand();
            fSelectCommand.Connection = conn;
            fSelectCommand.CommandText = "SELECT ImageBinary FROM Images WHERE ImageName = ?";
            fSelectCommand.Parameters.Add("@ImageName", OleDbType.VarChar).Value = fImageName;
           
            conn.Open();
            object o = fSelectCommand.ExecuteScalar();
            return (o == null ? null : (Byte[])o);
        }
    }
    private void button1_Click(object sender, EventArgs e)
    {
        using (OpenFileDialog dialog = new OpenFileDialog()) {
            dialog.Filter = "gif|*.gif";
            dialog.Multiselect = false;
           
            if (dialog.ShowDialog() == DialogResult.OK) {
                string fImageName = Path.GetFileNameWithoutExtension(dialog.FileName);
                FileStream fs = new FileStream(dialog.FileName, FileMode.Open, FileAccess.Read);
                BinaryReader br = new BinaryReader(fs);
                byte[] fInputImageBinary = br.ReadBytes((int)fs.Length);
                br.Close();
                fs.Close();
               
                // 保存到数据库
                this.InsertImageToAccess(fImageName, fInputImageBinary);
               
                // 从数据库获取图片并显示到 pictureBox1
                Byte[] fOutputImageBinary = this.GetImageFromAccess(fImageName);
                MemoryStream ms = new MemoryStream(fOutputImageBinary);
                pictureBox1.Image = Image.FromStream(ms);
            }
        }
    }


    知识改变命运,奋斗成就人生!
    2009年10月22日 9:17
    版主
  • 这不是还是要通过打开文件来获得吗???我这里需要的是说。我就是一个Image对象,来获得它的byte[]数组
    不通过BinaryReader br = new BinaryReader(fs); byte[] fInputImageBinary = br.ReadBytes((int)fs.Length);
    ,没有图片的名字和地址,就是一个Image对象

    2009年10月22日 9:22
  • public static byte[] ImgToByt(Image img)
            {
                MemoryStream ms = new MemoryStream();
                byte[] imagedata = null;
                img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                imagedata = ms.GetBuffer();
                return imagedata;            
            }

            public static Image BytToImg(byte[] byt)
            {
                MemoryStream ms = new MemoryStream(byt);
                Image img = Image.FromStream(ms);
                return img;
            }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 天驰 2009年10月22日 17:04
    2009年10月22日 9:26
    版主