从流数据库中读取图像

时间:2010-12-17 17:33:58

标签: .net vb.net sql-server-2008

亲爱的,我在流数据库中遇到了问题 我已经在那里写了一个图像,现在我想回想一下并把它放在PictureBox中 有谁能告诉我这样做的最佳做法? 非常感谢你提前。

3 个答案:

答案 0 :(得分:2)

  1. 使用ExecuteNonQuery方法来获取带图像的字节数组
  2. 在字节数组周围创建一个新的MemoryStream(不要破坏流,因为Image对象将继续使用它)。
  3. 致电Image.FromStream以阅读信息流
  4. 将此图像设置为PictureBox的Image属性。

答案 1 :(得分:1)

IMO最简单的方法是从数据库中读取所有数据并将其写入MemoryStream。倒回流(设置Position=0),然后使用new Bitmap(stream)Image.FromStream。请注意,您应该处理流...位图在您构建之后有效地“拥有”了该流。

答案 2 :(得分:1)

当图像很小或流量不显着时,上面提到的任何方法都可以工作,并且它们可以很好地降低流量。随着图像大小的增加,事情开始失控,因为所有这些解决方案都需要将整个图像作为字节数组存储在内存中。如果服务器上的负载很重要,那么所有这些图像文件副本占用宝贵的进程地址空间空间就会增加并且会极大地影响性能。

可以从具有流语义的数据库中读取,因此该文件的整个副本都不会存储在内存中:

  

为DataReader提供了一种方法   处理包含列的行   大二进制值。而不是   加载整行,   SequentialAccess启用   DataReader将数据作为流加载。   然后,您可以使用GetBytes或   GetChars方法指定一个字节   开始读取操作的位置,   以及数据的有限缓冲区大小   被退回。

最后一点有点问题。您可以将流写入虚拟映射到站点的WWW服务器本地文件夹,然后将URL返回到此文件。或者,您可以拥有一个读取图片本身的URL,并将图像直接写入ASP输出缓存。第一种方法可以为频繁访问的图像付出代价,因为缓存的文件可以服务多个请求,但它需要失效和清理逻辑。第二种方法更适用于未经检测的访问图像,但在您的应用中需要适当的路由逻辑。

当事情开始变得非常热时,在编组这些图像时阻塞线程的问题开始出现,你将不得不转移到Asynchronous pages,这是一个完全符合流复制语义的模型。