SQL Server存储图像数据的策略与方法

 

SQL Server存储图像数据的策略与方法

摘自:http://www.zhizihua.com/blog/post/95.html

目前对于图像数据的管理大都采用表+实体的方法,即图像数据以文件形式存放于指

定的计算机目录下,在数据库表中只反映图像数据文件的存储路径。这种管理模式,给数据的

维护增加了难度,同时,也给数据的安全带来一定的隐患。因此,要真正做到各类数据在数据

库中安全管理,研究和探索直接将图像数据存储在数据库关系表中的方法是非常必要的。

 笔者在Visual Basic 6.0开发环境中,采用客户机/服务器的工作方式,针对SQL

Server数据库关系表中存储图像数据的问题进行了初步探讨,提出了一套基本解决方案,供读者参考

图像存储原理

从结构上讲,图形文件分为两种,即位图和矢量图。在位图中,图像由许多的屏幕小点(我们通常说的像素)组成,这些小点对应显存中的“位”,而就是这些“位”决定了像素的图形属性,如像素的颜色、灰度、明暗对比度等。当一个像素所占的位数多时,它所能表现的颜色就更多、更丰富,从整体上看,图像的色彩就更艳丽,分辨率就更高。位图中所分的二位图、八位图等正是指像素所占的位数。当位图被放大或缩小时,由于像素的数量没有改变,图像的分辨率就会降低,图像的外观自然就大打折扣。相信朋友们在Word或WPS当中插入图像,安排图文结构时,或多或少都会遇到这种情况。就这方面来看,位图的缺点是显而易见的——分辨率的固定导致大分辨率的清晰图像占用大量空间;像素的分散性使动态图像的表达显得困难,例如看VCD时出现马赛克现象,就是像素丢失造成的。

  因此,研究人员开发出一种新的图形格式——矢量图。顾名思义,矢量图就是用矢量代替位图中的“位”。简单说来,矢量图不再给图的全部像素作统一的标记,而是用矢量给图的几何部分作标记。例如,一幅矢量图是绿色背景上,有一个黑色的圆圈。它的表达方式是先用语句调用调色板描述背景,再用带矢量的数学公式来描述圆圈的大小、形状等,这就使得图形的放大、缩小和移动变得十分简单,仅仅把公式中的矢量变量改一改就可以了,可以说矢量图的优点是很多的:能无限放大、缩小而不失真;不需要将图像每一点的状态记录下来,因而比相同质量和大小的位图占用的空间少得多,它甚至可以方便地通过更改内部公式制作动画,比位图省事多了。像Flash和CorelDraw等就是这样。

多样化的图像存储方式

我们现在所用的各式各样的图像存储方式,归根到底都离不开上面提到的两种最基本的原理。下面我就现在大家常见的几种图形存储方式作一个肤浅的介绍。

BMP(BitMap)——位图老祖宗

到现在为止,BMP还是Windows图形界面的基本构件之一,现在Windows的桌面依旧离不开它。BMP的颜色模式分为四种:2位(黑白)、4位(16色)、8位(256色)、24位(65535色)。由于这种格式无压缩,所以体积巨大。一张640×480的图,若色彩丰富的话,可高达1M~2M。即便如此,到现在它还得到不少人青睐的原因是,它不会丢失任何的图像细节,哪怕是一个细小的点,十分适合对图像要求严格的行业使用。

 JPG、JPEG(Joined Photographic Experts Group)——静态图像专家组

这是位图的另一种。还记得当初第一次见到JPG格式时的情景——目瞪口呆,它竟能把一幅1.05M的BMP图压缩成119K,并且在显示器上看,和原来的没什么不同。这就是JPEG格式的过人之处,它提供2:1到40:1的压缩比例,在8×8面积像素单元内进行压缩,当单元颜色值较单一时,则输出一种颜色,也就是说,它在压缩时只储存单元内相差较大的颜色值,随着压缩比例的上升,这一储存值便相应减少,利用人的视觉的灵敏度,将一些常人不易察觉的颜色变化略去。因此,在使用相同压缩比的条件下,一些颜色较单一的图像失真度较少,相反的就大一些。所以朋友们在制作使用JPEG图时,不妨多试几次不同的压缩率,以找到压缩率与失真度之间的最佳结合点。一般说来,JPEG格式的位图可获得10:1的压缩率而我们却不觉得它有失真现象。凭借此两大法宝,JPG、 JPEG广泛应用于各种领域,尤其在因特网上,可以说它对缩减网页的大小功不可没。(JPEG格式的^03020101a^像)

  GIF——动态位图开国元老

GIF包括三种格式,均为8位位图,最大支持256种颜色。一种是静态的GIF图,数据经过一定的压缩。另外两种是GIF89a和GIF87a。支持动画格式和透明效果,压缩方式与静态GIF图类似,可说是GIF的延续,但是由于它对颜色的支持不是很丰富,所以不论是动态的还是静态的GIF图,它都会使用真彩色的图像失真。因此,动态GIF图一般仅在网页中存在,而静态GIF图在JPEG及下面将提到的PNG格式的双重夹击下,越来越少人使用了。

  PNG——GIF补丁版

PNG是一种较新的位图格式,比较少人用,由于它与GIF格式相类似,支持透明格式,可惜并不支持动画效果,但最大可支持24位真彩色,多少弥补了静态GIF的不足。PNG格式的压缩算法有其独到之处,对8位及以下位图的压缩能力比JPEG的压缩算法要好。在肉眼观察失真度相当的情况下,JPEG格式仅有20~25:1,某些8位图片用PNG格式存储可达40~50:1的压缩比!可见以前的JPEG还没有到孤独求败的地步。但是,用PNG格式储存24位真彩图时,由于其要保留对透明格式的支持,状况惨不忍睹,文件比BMP格式的还大,难以想像它是怎么计算的。

 TIF、TIFF(Taggered Image File Format)——标记图像文件格式

TIF、TIFF主要用于页面排版的一种位图格式,用LZW编码压缩(与ARJ齐名的压缩方式),压缩比为2:1,这种格式通常使用在OCR软件识别扫描文档的存储中。

  PCD ——PhotoShop 的专利

PhotoShop专用的位图储存格式,可以说,它的保真度和BMP没什么两样,但是因为它要记录层,而且每一个层就是一幅等大小的图像,体积自然就比BMP大多了。不过正是因为这个层的存在,使得它可以存储许多BMP所不能存储的效果,因此很多美工、图像编辑人员用它来存储作品。

 WMF——Windows位元文件

Windows自定义的一种矢量图格式,Office剪辑库中的图形就使用这种格式。

 CDR——另一种选择

CorelDRAW系列软件定义的矢量图格式,可导入位图并进行压缩。与其相似的还有PhotoShop、FreeHand等软件各自定义的矢量图格式,由于各自的压缩算法不同,只有在未压缩的情况下才能相互调用。

 另外,还有一些常见但不常用的图形格式,如PCX、PIC、TAG等,这里就不再多说了

一、 存储图像数据的策略

在数据库的开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样-如有可能是语音文件、视频文件、图片文件、文本文件等,怎样实现这些格式不同的备注文件的存取及预览,一直是开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法。?

对备注二进制信息的存储可以采用以下三种方式;

   方法一:文件保存在固定的路径下,数据库中存取文件路径和名称?

   方法二:数据库中用blob类型或者varbinary类型字段存储备注文件

         方法三:在本地用PowerBuilder的OLE存储结构存储备注文件

三种方法的优缺点

    方法一:文件保存在固定的路径下,数据库中存取文件路径和名称可以节省数据空间,避免了数据库过分膨胀,但备注文件必须在一定的目录下,不能丢失,且同一目录下文件不能重名,对文件的管理造成一定的困难,另外,在OLE控件中浏览显示备注文件时,由于每次都要调用服务器程序,所以速度较慢。

    方法二:在数据库中用blob类型或者varbinary类型字段存储备注文件,当文件存储在数据库中以后,就可以删除硬盘上原来的临时文件,不需要复杂的二进制文件管理,且数据库可以存储在网络服务器上,对数据的共享非常方便。

    方法三:在本地用OLE存储结构存储备注文件。可以把所有的二进制文件信息存储在一个OLE存储文件中,管理比较方便。当二进制文件信息存储后,可以删除原来的临时文件;因为打开存储文件后不需要每次执行服务器程序来显示存储信息,所以存取速度较快。

SQL Server 2000存储图像数据库设计

图像数据库技术一直致力于解决海量数字图像的有效存储和管理问题。它是数据库技术的继承和发展,一方面,图像数据和文本数据存在着本质的区别,在文本数据领域得以成功应用的传统数据库技术,如果一成不变的照搬到图像数据库领域,结果往往是低效,甚至无效;另一方面,传统数据库的许多成果,如SQL语言、索引技术等都值得图像数据库借鉴。上述两个方面的结合成为目前图像数据库技术发展的主流。

1.1 BLOB数据类型

 BLOB是非常巨大的不定的二进制或者字符型数据,通常是文档(.txt、.doc)和图片(.jpeg、.gif、.bmp),它可以存储在数据库中。在SQL Server中,BLOB可以是text、ntext或者image数据类型。 Image数据类型存储的是长度不确定的二进制数据,最大长度是2GB。

 BLOB数据在SQL Server系统中的存储方式不同于普通的数据类型,对于普通类型的数据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条记录的BLOB数据的页面。

1.2 BLOB的设计策略

 BLOB数据是数据量很大的数据类型,它会占用大量的硬盘空间、内存和网络资源,因此合理地设计包含有BLOB数据类型的属性表,对提高存储效率、查询速度有很大的影响。一般BLOB的设计原则如下:

(1) 使用BLOB数据类型还是使用varchar或者varbinary数据类型

 二进制大对象并不一定要存储为text、ntext或者image数据类型,它们也可以作为varchar或者varbinary数据类型村处在表格中。数据类型的选择要根据将要存储的BLOB的实际大小。如果数据不会超过8K,那么就使用Varchar或者varbinary数据类型。如果这些大对象的尺寸超过8K,那么就使用text、ntext或者image数据类型。

(2) 存储BLOB在数据库中或者在文件系统中

 常见的设计问题是将图片存在数据库中还是存在文件系统中。在大多数情况下,最好把图片文件与其它数据一起存在数据库中。因为将影像数据文件存储在数据库中有许多优点:

 易于管理 当BLOB与其他数据一起存储在数据库中时,BLOB和表格是数据一起备份和恢复。这样就降低了表格数据与BLOB数据不同步的机会,而且降低了其他用户无意中删除了文件系统中BLOB数据位置的路径和风险。另外,将数据存储在数据库中BLOB和其他数据的插入、更新和删除都在同一个事务中实现。这样就确保了数据的一致性和文件与数据库之间的一致性。还有一点好处是不需要为文件系统中的文件单独设置安全性。

 可伸缩性 尽管文件系统被设计为能够处理大量不同大小的对象,但是文件系统不能对大量小文件进行优化。在这种情况下,数据库系统可以进行优化。

 可用性 数据库具有比文件系统更多的可用性。数据库复制允许在分布式环境中复制、分配和潜在的修改数据。在主系统失效的情况下,日志转移提供了保留数据库备用副本的方法。

当然,在某些情况下,将图片存储在文件系统中将是更好的选择:

(1)使用图片的应用程序需要数据流性能,例如实时的视频重现。

(2)象Microsoft PhotoDraw或者Adobe Photoshop这样的应用程序经常访问BLOB,这些应用程序只知道怎样访问文件。

(3)需要使用一些NTFS文件系统中的特殊功能,例如远程存储。

存储图像数据的方法

建立具有image宇段的SQL Server数据库

 当需要在SQL Server数据库中存储图像数据时,首先应建立包含image数据类型字段的数据库关系表。SQL Server数据库平台支持的数据类型中,image数据类型主要用于存储图像数据等大段的二进制数据。SQL Server 7.0之后的版本,image类型可存储2GB的数据。

随着SQL Serve数据库管理系统功能的不断增强、性能的不断完善,将各类数据完全由数据库管理系统统一存储和管理,已成为技术发展的趋势。只有这样,SQL Serve数据库管理系统的强大功能才能得到充分发挥,数据的安全性才能得到充分的保障,使得诸如数据库复制、数据的转移等许多工作,变得非常简单容易。

 图像数据库技术一直致力于解决海量数字图像的有效存储和管理问题。它是数据库技

术的继承和发展,一方面,图像数据和文本数据存在着本质的区别,在文本数据领域得以成功

应用的传统数据库技术,如果一成不变的照搬到图像数据库领域,结果往往是低效,甚至无效

;另一方面,传统数据库的许多成果,如SQL语言、索引技术等都值得图像数据库借鉴。上述

 1.1 BLOB数据类型

 BLOB是非常巨大的不定的二进制或者字符型数据,通常是文档(.txt、.doc)和图片

(.jpeg、.gif、.bmp),它可以存储在数据库中。在SQL Server中,BLOB可以是text、

ntext或者image数据类型。 Image数据类型存储的是长度不确定的二进制数据,最大长度是

 BLOB数据在SQL Server系统中的存储方式不同于普通的数据类型,对于普通类型的数

据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来

存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条

 1.2 BLOB的设计策略

 BLOB数据是数据量很大的数据类型,它会占用大量的硬盘空间、内存和网络资源,因

此合理地设计包含有BLOB数据类型的属性表,对提高存储效率、查询速度有很大的影响。一般

 (1) 使用BLOB数据类型还是使用varchar或者varbinary数据类型

 二进制大对象并不一定要存储为text、ntext或者image数据类型,它们也可以作为

varchar或者varbinary数据类型村处在表格中。数据类型的选择要根据将要存储的BLOB的实际

大小。如果数据不会超过8K,那么就使用Varchar或者varbinary数据类型。如果这些大对象的

 (2) 存储BLOB在数据库中或者在文件系统中

 常见的设计问题是将图片存在数据库中还是存在文件系统中。在大多数情况下,最好

把图片文件与其它数据一起存在数据库中。因为将影像数据文件存储在数据库中有许多优点:

 易于管理 当BLOB与其他数据一起存储在数据库中时,BLOB和表格是数据一起备份和

恢复。这样就降低了表格数据与BLOB数据不同步的机会,而且降低了其他用户无意中删除了文

件系统中BLOB数据位置的路径和风险。另外,将数据存储在数据库中BLOB和其他数据的插入、

更新和删除都在同一个事务中实现。这样就确保了数据的一致性和文件与数据库之间的一致性

。还有一点好处是不需要为文件系统中的文件单独设置安全性。

 可伸缩性 尽管文件系统被设计为能够处理大量不同大小的对象,但是文件系统不能

对大量小文件进行优化。在这种情况下,数据库系统可以进行优化。

 可用性 数据库具有比文件系统更多的可用性。数据库复制允许在分布式环境中复制

、分配和潜在的修改数据。在主系统失效的情况下,日志转移提供了保留数据库备用副本的方

 当然,在某些情况下,将图片存储在文件系统中将是更好的选择:

 (1)使用图片的应用程序需要数据流性能,例如实时的视频重现。

 (2)象Microsoft PhotoDraw或者Adobe Photoshop这样的应用程序经常访问BLOB,

 (3)需要使用一些NTFS文件系统中的特殊功能,例如远程存储。

 二、 存储图像数据的方法

 1 建立具有image宇段的SQL Server数据库

 当需要在SQL Server数据库中存储图像数据时,首先应建立包含image数据类型字段

的数据库关系表。SQL Server数据库平台支持的数据类型中,image数据类型主要用于存储图

像数据等大段的二进制数据。SQL Server 7.0之后的版本,image类型可存储2GB的数据。

 2 使用Remote Data控件建立与数据库的连接

 Remote Data控件是在Visual Basic应用程序中用来获取远程数据的控件。它在.远

程数据对象(RDO)和数据绑定控件之间提供了接口,只要给它提供有关数据存储的位置、获取

的数据和一些接口控制,就可以连接到数据库,实现对数据库的基本操作。

 使用Remote Data控件建立与远程数据库的连接步骤如下:

 1.在Visual Basic的窗体中加入一个Remote Data控件。 ,

 2.在Remote Data控件DataSourceName属性的下拉列表中选择一个ODBC数据源。例如

 3.在Remote Data控件的SQL属性中输入SQL查询语句。例如,Select * from

 2.3 绑定OLE和Remote Data控件实现图像数据的存储与编辑

 OLE是允许应用程序相互之间交换和显示数据的一项技术,使用OLE,可以从支持OLE

技术的任何应用程序中读取信息,也可以在任何支持OLE的程序中显示和编辑它。在Visual

Basic中,可利用OLE容器控件与Remote Data控件的绑定,来实现显示、存储和编辑SQL

 1.显示SQL Serve数据库image类型字段的图像数据

 具体步骤如下:

 (1)在加入了Remote Data控件的Visual Basic的窗体中,添加一个OLE容器控件。创

建OLE容器控件时,会出现“插入对象’:对话框,此时点击“取消”按钮,不必为该容器指

 (2)将OLE容器控件的DataSource属性设置为Remote Data控件的名字,实现控件的绑

 (3)在OLE容器控件。DataField属性的下拉列表中选择要显示的字段名。例如,logo

 (4)运行应用程序。对于包含image数据类型的logo字段的数据将在OLE容器控件中显

 2.在SQL Sever数据库image类型字段中添加存储图像数据

 具体步骤如下:

 (1)将Remote Data控件的EOFAction属性设置为rdAddNew,实现数据库的数据添加功

 (2)在Visual Baisic的窗体中添加一个CommandButton控件,并编写图像文件嵌入OLE

  Private Sub Command_Click()

  OLEl.CreateEmbed“c:\图片.bmp”

  End Sub

 (3)运行应用程序,点击Remote Data控件的记录指示按钮,移动到新的记录,然后点

击CommandButton控件按钮,实现图像数据的添加入库操作。

 3.编辑SQL Serve数据库image数据类型字段的图像数据

 具体步骤如下:

 (1)在Visual Basic的窗体中添加一个CommandButton控件,编写对OLE对象的编辑程

  Private Sub Command2--_Click()

  OLEl.DoVerb VbOLEOpen

  End Sub

 (2)运行应用程序,点击Remote Data控件的记录指示按钮,选择需要编辑的图像,

然后点击CommandButton控件按钮,在分隔的应用程序窗口打开对象,进行图像的编辑操作。

 4、图像文件自动入库方式的实现

 在数据库的实际应用中,经常需要将图像文件批量存储,以提高数据入库操作的自动

化程度。对于图像文件批量存储,在程序代码的编写中,可充分利用OLE容器控件与

RemoteData控件的诸多属性和方法,加以实现。

 具体步骤如下:

 (1)将OLE和RemoteData控件的Visible属性设置成False,使OLE和RemoteData控件不

 (2)建立图像文件的批处理文件。

 (3)编写以下基本代码,实现批处理功能。

  Private Sub Command3_Click()

  Dim FileName As String

  Open "c:\tesffile.txt"ForlnputAs#1'打开批处理文件。

  DoWhileNotEOF(1)'循环至文件尾。

  Input#l,FileName'读入图像文件名。

  MSRDCl.Resultset.AddNew‘结果集添加记录

  OLEl.CreateEmbedFileName‘嵌入图像文件

  MSRDCl.Resultset.Update

  Loop

  Close #1

  End Sub

 (4)运行应用程序。点击CommandButton控件按钮,完成图像文件的自动入库。

 五、结束语

 随着SQL Serve数据库管理系统功能的不断增强、性能的不断完善,将各类数据完全

由数据库管理系统统一存储和管理,已成为技术发展的趋势。只有这样,SQL Serve数据库管

理系统的强大功能才能得到充分发挥,数据的安全性才能得到充分的保障,使得诸如数据库复

制、数据的转移等许多工作,变得非常简单容易。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值