将图像转换为字节数组,然后再转换回来

本文关键字:转换 然后 数组 回来 字节数 图像 字节 | 更新日期: 2023-09-27 18:24:03

我意识到这个问题以前被问过,并且有答案,但不是以这种特定的方式。我已经想了大约7个小时了。

我有一张图片,我把它转换成字节数组存储在Access数据库(.mdb)中

[图像]->[字节数组]->[访问数据库(字段为OLE对象)]^我可以很好地完成这一部分,在这里完成:

public byte[] ImageToByte(Image img)
{
    Bitmap BmpImage = new Bitmap(img);
    BmpImage.Save(Application.StartupPath + @"'unmodified.png", System.Drawing.Imaging.ImageFormat.Png);
    MemoryStream mStream = new MemoryStream();
    PartPhoto.Image.Save(mStream, System.Drawing.Imaging.ImageFormat.Png);
    byte[] imgAsByte = mStream.ToArray();
    return imgAsByte;
}

然后我把我所有的数据都像这样存储在我的数据库中:

    Part p = new Part();
    p.PartCode = IPC.Text; 
    p.PartName = IPN.Text;
    p.PartDesc = IDESC.Text;
 -->p.PartPhoto = ImageToByte(PartPhoto.Image);
    p.PartSize = size;
    p.PartWeight = weight;
    p.PartType = IPT.Text;
    p.LeadTime = ILT.Text;
    p.PartCost = ICOST.Text;
    p.PartQuantity = IQNT.Text;
    d.Insert(p);

Insert方法可以做到这一点:

 command.CommandText = "Insert INTO PartInfo (PartCode, PartName, PartDesc, PartPhoto, PartSize, PartWeight, PartType, LeadTime, PartCost, PartQuantity) VALUES('" + p.PartCode + "', '" + p.PartName + "', '" + p.PartDesc + "', '@Pic', '" + p.PartSize + "', '" + p.PartWeight + "', '" + p.PartType + "', '" + p.LeadTime + "', '" + p.PartCost + "', '" + p.PartQuantity + "')";
                    command.Parameters.Add("@Pic", p.PartPhoto);
command.CommandType = CommandType.Text;
connection.Open();
command.ExecuteNonQuery();

它在我的数据库中(在OLE对象字段中)显示为长二进制数据。我从数据库读取到DataGridView中,如下所示:

 String query = "SELECT * FROM PartInfo WHERE PartName CONTAINS " + "'"" + PN + "'"";
 connection.Open();
 da.SelectCommand = new OleDbCommand(query, connection);
 da.Fill(dt);

然后我打电话给:

PartGrid.DataSource = d.dt;
PartGrid.Refresh();

刷新网格。

这是我的问题。我无法从DataGridView中读取回字节数组。我尝试了几种不同的方法,总是得到相同的错误:"参数无效"

byte[] picBytes = (byte[])PartGrid.Rows[row].Cells[3].Value;
MemoryStream ms = new MemoryStream(picBytes);
Image partPic = Image.FromStream(ms); //ERROR: "Parameter is not valid"
Bitmap bmp = new Bitmap(partPic);
bmp.Save(Application.StartupPath + @"'test.png", System.Drawing.Imaging.ImageFormat.Png);
return partPic;

我调用从字节数组到图像的转换,如下所示:

PartPhoto.Image = ImageFromByte(e.RowIndex); 

就像我说的,我已经被这个问题困扰了好几个小时了,而且越来越令人恼火。

将图像转换为字节数组,然后再转换回来

尝试使用System.IO.File.ReadAllBytes将图像转换为字节数组,并使用System.IO.File.WriteAllBytes转换回图像。