这两天做一个市场管理软件的时候遇到个比较麻烦的事情,要求使用 PictureBox 来显示图片,并且用 Access 做数据库来存放数据。上网搜索了好久才找到资料,大致思路就是将 PictureBox 中的数据转换为数据流,然后把数据流再转换为二进制数据,最后使用 ACCESS 中的 OLE 二进制存储。而读取的过程是将 ACCESS 中的二进制数据转换为数据流,然后用 PictureBox 来读取这个数据流,和存储的过程是相反的。
虽然知道了原理,但是网上给的代码并不能使用,可能是作者的疏忽吧,所以还是花了我整整一天的时间才把这个问题解决,写了两个用于转换的函数。
public byte[] FormatToByte(Image img)
{
if (img == null)
{
return null;
}
MemoryStream ms = new MemoryStream();
byte[] rawData = null;
//此处使用img.RawFormat会发生GDI+错误
img.Save(ms, img.RawFormat);
ms.Flush();
ms.Position = 0;
rawData = new byte[ms.Length];
ms.Read(rawData, 0, rawData.Length - 1);
ms.Close();
return rawData;
}
public Image FormatToStream(byte[] bin)
{
if (bin.Length < 1)
{
return null;
}
MemoryStream ms = new MemoryStream(bin);
Image img = Image.FromStream(ms);
ms.Close();
return img;
}
当然了,这个代码其实在使用过程中还是有两个问题的
-
我在代码中批注了一个小问题,就是图片格式并不能保证是万能的,所以只好限制所使用的图片格式为有限的几种。
-
如果使用本方法存储了一个图片再读出,那么不能就简单的再存入,这个我也不知道是什么原因,猜想可能是读出之后不能确定图片数据的存储格式,不过我是想的其他方法避开二次存储了,呵呵要完全解决这个问题得花我好长时间呢,所以先保证程序能正常使用吧。
如果有那位大虾知道解决以上两个问题的方法,或者有更好的存储思路,希望给小弟留个言,指点一二哦。