图片框到字节数组

时间:2014-10-16 13:40:59

标签: c# image bytearray picturebox

我有一个程序来选择图像并在图片框中设置所选图像,然后将图像框中的图像转换为字节数组,并将sql server数据库保存在图像类型列中。

在浏览按钮点击事件中,我选择了这样的图像文件。

OpenFileDialog fop = new OpenFileDialog();
fop.InitialDirectory = @"Desktop";
fop.Filter = "image files|*.jpg;*.png;*.gif";
if (fop.ShowDialog() == DialogResult.OK)
{
     FileStream FS = new FileStream(@fop.FileName, FileMode.Open, FileAccess.Read);  
     pbPartySymbol.Image = new Bitmap(fop.FileName);
     MessageBox.Show("Image Imported Successfully!!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

选择图像并将其设置为图片框图像后,我将保存按钮单击事件中的图片框图像转换为字节数组,并将字节数组保存到数据库中。

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
    return ms.ToArray();
}

我正在调用这样的方法。

byte[] myArr1 = imageToByteArray(pbPartySymbol.Image);

我将这个字节数组传递给数据库。它也节省了。但 ALL 添加的图像保存如下。* 0x53797374656D2E427974655B5D *保存的图像无法在读取操作中返回到图片框。我在 SAVING 中做错了什么?

这是我在表单中保存操作时所做的工作。

            Party ptObj = new Party(myArr1);
            if (new PartyOP().saveParty(ptObj))
            {
                MessageBox.Show("NEW data added");
            }

在我的业务操作层中,这是我的代码。

          public Boolean saveParty(Party ptObj)
         {
          string query1 = "EXEC insertToParty'" + ptObj.PTSymARR + "'";
           return (new DataAccessLayer().executeNonQueries(query1));
        }

这是我如何在Party类中设置属性。

class Party
{
    public Party() { }
    public Party(byte[] ptSym) 
    {

        this._PTSymARR = ptSym;

    }
    public byte[] PTSymARR
    {
        get { return _PTSymARR; }
        set { _PTSymARR = value; }
    }


}

这是我的存储过程。       CREATE PROCEDURE insertToParty    (       @ptSymbol图片   )     如     开始     开始交易     设置NOCOUNT ON;       --query     插入党(PTSYM)        价值观(@ptSymbol);

PTSYM的数据类型是图像数据类型。

1 个答案:

答案 0 :(得分:2)

该十六进制字符串转换为System.Byte[]

将Byte-Array添加到以EXEC insertToParty开头的字符串中,以便.Net假定您需要该变量的字符串表示形式。除非指定它调用.ToString给你....“System.Byte []”。

编辑:您的存储过程不会在插入时使用十六进制编码。在SQL Studio等中查看时,image数据以十六进制显示。

如果您在插入和解码时使用base64或hex将字节数组编码为字符串,那么在读取数据时您只需要担心增加的存储空间,但我建议您从动态SELECT更改数据库访问准备好参数的声明:

SqlCommand command = new SqlCommand("Exec InsertToParty(@blob)");
command.Parameters.AddWithValue("@blob", ptObj.PTSymARR);
command.ExecuteNonQuery();