0

我能够成功地将图像存储在 SQL DB 中,图像有一个字段为 varchar50。这是我尝试过的代码

DataTable dt=new DataTable();
dt=neworder.Selectfromimage1();

if (dt.Rows.Count > 0)
{

 // byte[] image =(byte[])dt.Rows[0]["image"];
 byte image=Convert.ToByte(dt.Rows[0]["image"]);
 MemoryStream stream = new MemoryStream(image);
 //stream.Write(image, 0, image.Length);
 stream.Seek(0,

 SeekOrigin.Begin);
 stream.Close();

 btncompanion.Image =

 Image.FromStream(stream);
 }

我收到错误“输入字符串的格式不正确”

byte image=Convert.ToByte(dt.Rows[0]["image"]);

已编辑

保存图像的代码是

private byte[] ImageToStream(string fileName)
{

 MemoryStream stream = new MemoryStream();
 tryagain:

 try
 {

  Bitmap image = new Bitmap(fileName);
  image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);

  // image.Save(stream, System.Drawing.Imaging.ImageFormat.Gif);
 }

 catch (Exception )
 {

  goto tryagain;
 }

 return stream.ToArray();
}
fName ="C:\\Documents and Settings\\KAEM\\My Documents\\My Pictures\\images.jpg";
if (File.Exists(fName))
{

 int id = 2;
 byte[] content = ImageToStream(fName);
 if (neworder.Insertintoimage1(content.ToString()))
 {

}

}

else
{

 MessageBox.Show(fName + " not found ");
}
4

3 回答 3

1

您将图像的路径存储在数据库中。您的代码应如下所示:

string imagePath=dt.Rows[0]["image"].ToString();
            byte[] imageBytes;
            using (FileStream fs = File.Open(imagePath)) {
                 btncompanion.Image = Image.FromStream(fs);
            }

试试这个,没测试

于 2013-02-06T07:57:10.427 回答
1

在尝试阅读之前,您正在关闭流。那是行不通的。您应该尝试以下方法:

byte[] image=Convert.ToByte(dt.Rows[0]["image"]);
using (MemoryStream stream = new MemoryStream(image))
{
    btncompanion.Image = Image.FromStream(stream);
}

如果这不起作用并给出 GDI+ 错误,那是因为在图像反序列化之前流已关闭。在这种情况下使用这个:

byte image=Convert.ToByte(dt.Rows[0]["image"]);
MemoryStream stream = new MemoryStream(image);
btncompanion.Image = Image.FromStream(stream);

此外,在存储图像的代码中,您从图像文件中获取字节,但将它们作为string数据库传递。您是否知道图像字节可以包含从字符串中删除或终止字符串的不可打印字节?

不要将图像存储为字符串或至少使用 base 64 编码。代码如下:

if (File.Exists(fName))
{
    byte[] content = ImageToStream(fName);
    string contentBase64 = Convert.ToBase64String(content);
    if (neworder.Insertintoimage1(contentBase64))
        ....
}

并检索:

string image = dt.Rows[0]["image"];
byte[] imageBytes = Convert.FromBase64String(image);

MemoryStream stream = new MemoryStream(imageBytes);
btncompanion.Image = Image.FromStream(stream);
于 2013-02-06T08:09:36.493 回答
0

您必须弄清楚如何对数据进行编码以生成 varchar 字符串。例如,如果它是 base64,您将使用Convert.FromBase64String

byte[] image = Convert.FromBase64String(dt.Rows[0]["image"])

现在,由于您是存储图像的人,您应该知道它是如何编码的,并且应该能够执行相反的过程以将其取回。

于 2013-02-06T07:06:26.093 回答