【问题标题】:Picture box to byte array图片框转字节数组
【发布时间】:2014-12-11 21:53:29
【问题描述】:

我有一个程序来选择图像并将所选图像设置在图片框中,然后将图像框中的图像转换为字节数组并将 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);

我正在将此字节数组传递给数据库。它也可以节省。但是所有添加的图片都是这样保存的。* 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; }
    }


}

这是我的存储过程。 创建过程 insertToParty ( @pt符号图像 ) 作为 开始 开始交易 设置无计数; - 询问 插入派对(PTSYM) 值(@ptSymbol);

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

【问题讨论】:

  • 您的代码似乎没问题,至少在我看来。 db 列是如何定义的,你如何读回它,那里会发生什么?
  • @TaW 我有一个存储过程要添加。我只是调用它并传递参数列表。 public Boolean saveParty(Party ptObj) { string query1 = "EXEC insertToParty'" + ptObj.PTSymARR + "'"; return (new DataAccessLayer().executeNonQueries(query1));在这里,我将字节数组作为对象属性传递。事情是数据库中所有保存的图像看起来像这样 0x53797374656D2E427974655B5D
  • 我迷路了。这是Byte[],您正在保存它。你期望看到什么?如果您希望稍后将其恢复为图像,请反转该过程。
  • 什么是DB数据类型,你用什么DBMS?
  • @DonBoitnott 没什么可看的。请阅读> 数据库中所有保存的图像记录都显示此记录,0x53797374656D2E427974655B5D。不可能所有记录都相同。因为我没有保存相同的图像。

标签: c# image bytearray picturebox


【解决方案1】:

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

您将字节数组添加到以EXEC insertToParty 开头的字符串中,因此.Net 假定您想要该变量的字符串表示形式。除非指定,否则它会调用 .ToString 给你....“System.Byte[]”。

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

如果您在插入时使用 base64 或十六进制将字节数组编码为字符串,并在读取数据时对其进行解码,您只需要担心增加的存储空间,但我建议您从动态 SELECT 更改数据库访问权限到带有参数的准备好的语句:

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

【讨论】:

  • 存储过程是必须的,难道我可以在不删除存储过程的情况下编辑它。
  • 任何代码示例?如果您需要检查,我也添加了我的存储过程代码。
猜你喜欢
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2014-12-14
  • 2023-03-24
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多