保存图像文件,SQL Server和转换字节数组转换为图像 [英] Saving an Image file to sql Server and converting byte array into image

查看:158
本文介绍了保存图像文件,SQL Server和转换字节数组转换为图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在数据库中存储的图像,并想将它们从字节数组转换为图像。我没有问题,将对象转换为字节数组,但我得到一个错误参数无效试图从字节数组转换为图像时。我传递给我的方法的对象是从数据集中一行。

I am storing images in a database and would like to convert them from byte array to image. I have no problem converting an object to byte array but I get an error of "Parameter is not valid" when trying to convert from byte array to image. The object I am passing to my method is from a dataset row.

存储过程

USE [----------------]
GO
/****** Object:  StoredProcedure [dbo].[usp_imageloader_add_test]    Script Date: 01/16/2012    09:19:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER   procedure [dbo].[usp_imageloader_add_test]
@p_Image Image
as 

INSERT into Test_Images VALUES(@p_Image)

上传文件控制 /图像文件转换为字节数组,将数据保存到数据库

Upload File control /convert Image file to byte array and save data to database

 protected void btnUpload_Click(object sender, EventArgs e)
    {
        if (ctrlUpload.PostedFile != null)
        {
            if (ctrlUpload.PostedFile.ContentLength > 0)
            {
                // Get Posted File
                HttpPostedFile objHttpPostedFile = ctrlUpload.PostedFile;

                // Find its length and convert it to byte array
                int ContentLength = objHttpPostedFile.ContentLength;

                // Create Byte Array
                byte[] bytImg = new byte[ContentLength];

                // Read Uploaded file in Byte Array
                objHttpPostedFile.InputStream.Read(bytImg, 0, ContentLength);

                using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db))
                {
                    try
                    {
                        string sql = "usp_imageloader_add_test";
                        SqlCommand cmd = new SqlCommand(sql, dbConnection);
                        cmd.CommandType = System.Data.CommandType.StoredProcedure;
                        cmd.Parameters.AddWithValue("@p_Image", bytImg).SqlDbType = SqlDbType.Binary;
                        cmd.Connection.Open();
                        cmd.ExecuteNonQuery();
                        cmd.Connection.Close();
                    }


                    catch (Exception ex)
                    {
                        ex.Message.ToString();
                    }
                }
            }
        }
    }

它调用objToImg方法

protected void Page_Load(object sender, EventArgs e)
    {
        generateTable(false);
    }


private Table generateTable(bool flag)
    {
        Table tb = BuildList(GetData(), flag);
        if (imgloadercms != null)
        {

            PlaceHolder ph = new PlaceHolder();
            StringBuilder sb = new StringBuilder();
            ph.Controls.Add(new LiteralControl(sb.ToString()));
        }
        imgloadercms.Controls.Add(tb);
        return tb;
    }


protected Table BuildList(DataTable tb, bool flag)
    {   
        Table tblImageLibrary = new Table();
        tblImageLibrary.BorderStyle = BorderStyle.Solid;
        tblImageLibrary.BorderWidth = Unit.Pixel(8);

        if (tb.Rows.Count > 0)
        {
            try
            {
                if (!flag)
                {

                    tblImageLibrary.BorderColor = Color.Black;
                    tblImageLibrary.BorderWidth = Unit.Pixel(1);
                    TableRow tr = new TableRow();  // Table row for header of table
                    tr.BackColor = Color.LightBlue;

                    TableCell c1 = new TableCell();
                    TableCell c2 = new TableCell();


                    c1.Controls.Add(new LiteralControl("Image Id"));
                    tr.Cells.Add(c1);
                    c2.Controls.Add(new LiteralControl("Image"));
                    tr.Cells.Add(c2);

                    tblImageLibrary.Rows.Add(tr);
                }

                int i = 0;

                foreach (DataRow r in tb.Rows) // Create new row foreach row in table
                {
                    TableRow tr = new TableRow();
                    if (i % 2 == 0)
                    {
                        tr.BackColor = Color.LightYellow;
                    }
                    // Build cells
                    TableCell c1 = new TableCell();
                    TableCell c2 = new TableCell();
                    c2.Width = 300;

                    c1.Controls.Add(new LiteralControl(r["Image_Id"].ToString()));
                    tr.Cells.Add(c1);

                    // Call method to serialize obj to byte array
                    //System.Drawing.Image dbImg = 
                    ObjToImg(r["Image_File"]);

               }
            catch (Exception ex)
            {
                ex.ToString();
            }
            if (!flag)
            {

            }
        }
        return tblImageLibrary;
    }

返回图片

  private System.Drawing.Image ObjToImg(object obj)
    {
        //byte[] byteArray = null;

        if (obj == null)
            return null;
        else
        {

            BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                bf.Serialize(ms, obj); //now in Memory Stream
                ms.ToArray(); // Array object
                ms.Seek(0, SeekOrigin.Begin);

                //return (System.Drawing.Image)bf.Deserialize(ms);

                System.Drawing.Image myImage = (System.Drawing.Image)bf.Deserialize(ms);

                return myImage;
            }

每当我试着内存流对象添加到图像对象的构造函数,我得到的错误消息参数无效。也许我时插入的字节数组到数据库,因为我已经看了其它code和它没有任何意义怎么不工作犯了一个错误。

Whenever I try to add the memory stream object to the image object constructor I get the error message of "Parameter is not valid". Maybe I made a mistake when insert the byte array into the database because I have looked at other code and it doesn't make sense how it's not working.

推荐答案

我最近刚刚做同样的事情在VB.NET。这里是我的code,通过Telerik的$ C $ D转换器运行。这是相当棘手的工作,而且还是老老实实一种痛苦。

I just recently had to do the exact same thing in VB.NET. Here is my code, run through Telerik's Code Converter. It was quite tricky to get working, and is still honestly a pain.

要上传图片:

private bool uploadImage(ref Bitmap p)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = Configuration.ConfigurationManager.ConnectionStrings("ConnStringHere").ConnectionString;
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "INSERT INTO Table_Name (File2) VALUES (@File2)"; //I named the column File2 simply because "File" seemed to be a keyword in SQLServer
    cmd.CommandType = CommandType.Text;
    cmd.Connection = con;

    SqlParameter File1 = new SqlParameter("@File2", SqlDbType.Image);
    MemoryStream ms = new MemoryStream();

    using (Bitmap tempImage = new Bitmap(p))
    {
        tempImage.Save(ms, p.RawFormat);
    }

    byte[] data = ms.GetBuffer();
    if (!isValidImage(data)) //optional, will include code if requested.
    {
        return false;
    }
    File1.Value = data;
    cmd.Parameters.Add(File1);

    con.Open();
    int result = cmd.ExecuteNonQuery();
    if (result > 0)
    {
        // SUCCESS!
        con.Close();
        return true;
    }
    else
    {
        //failure
        con.Close();
        return false;
    }

}

要检索图片:

private Bitmap retrieveBitmap()
    {
        Image image1 = null
        if (dt1.Rows.Count > 0)
        {
            byte[] imageData1 = null;
            if (dt1[0].Count > 0)
            {
                if (!Information.IsDBNull(dt1.CopyToDataTable()[0].Item("File2")))
                {
                    imageData1 = (byte[])dt1.CopyToDataTable()[0].Item("File2");
                }
            }
            if ((imageData1 != null))
            {
                if (isValidImage(imageData1))
                {
                    using (MemoryStream ms = new MemoryStream(imageData1, 0, imageData1.Length))
                    {
                        ms.Write(imageData1, 0, imageData1.Length);
                        image1 = Image.FromStream(ms, true);
                    }
                    return image1;
                }
                else
                {
                    // "Invalid image on server";
                    return null;
                }
            }
        }
    }

我的code可能需要小的格式更改,请编辑任何具有无效语法(我的C#是有点生疏了,我的code是通过转换运行)。

My code may need small formatting changes, please edit whatever has invalid syntax (my C# is a little rusty, and my code was run through a converter).

这篇关于保存图像文件,SQL Server和转换字节数组转换为图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆