在数据库表的一个BLOB行字段里,存放了.jpg .bmp .ico等等格式的图片,读出来显示的时候怎么才能知道图片的格式类型? (276分)

S

SEVN

Unregistered / Unconfirmed
GUEST, unregistred user!
在数据库表的一个BLOB行字段里,存放了.jpg .bmp .ico等等格式的图片,
读出来显示的时候怎么才能知道图片的格式类型?
如果字段里存放的是.doc .txt .*** 等等格式的文件呢?读出来的时候怎么才能知道
字段里存放的是什么格式的什么东西?
征询各种方法,不论优劣,只要可能实现的都讲一讲。
这个问题纯粹从技术实现上来讨论,不考虑应用。
谢谢各位参与,来者有份(分),只要您想到的方法,就说说吧。
 
什么?
why?
 
判断后缀名不就是知道罗
 
孔:
怎么判断存放在字段里的内容的格式呢?怎么得到后缀?
 
加一个字段放文件名
 
to :stlont
谢谢,我想要直接的方法,变通的办法不好。
 
呵呵,读出来放到一个 TMemoryStream 里面:
TBlobField(aDataSet.Fields[0]).SaveToStream(aMemoryStream);
然后用一个 TImage 直接从流中读取出来显示:
aImage.Picture.Graphic.LoadFromStream(aMemoryStream);
就可以了吧,TImage 会自动判断图片格式的。
 
to beta
哥们还有一问:
如果字段里存放的是.doc .txt .*** 等等格式的文件呢?读出来的时候怎么才能知道
字段里存放的是什么格式的什么东西?
 
哪就不能这样了:(
谁叫你要混放呢?放图片的字段就只放图片嘛。
你是到底放的什么呢?
 
是这样,放图片的字段里放各种格式的图片。
放文件的字段里放各种格式的文件,也可能是图片文件。
 
二进制的内容,要读内容要相关的类,我试过读BMP
 
你将 Image.Picture.Graphic.LoadFromStream 放在异常捕捉部分里面:
try
Image.Picture.Graphic.LoadFromStream(aMemoryStream);
except // 发生异常,说明不是图片
// 处理其他格式
end;

不过如果是其他格式的时候,判断就比较麻烦了,比如 .doc 和 .txt 都是
纯文本文件,无法区分!
所以建议你最好还是单独用一个字段储存文件的类型。
 
直接的办法:
读出来后分析内容,一般不同格式文件的文件头都有相应的特征。
你要了解所有你要用到的文件格式的文件头,我估计这个工作超出
了你的能力范围。
如果想试一试,建议先去买本《图形文件格式大全》,我手头有两本,
是海洋和学苑的,比较老了。doc的格式我没分析过,txt就是文本,
没有什么文件头。
下面的站点有很多文件格式,建议先去看看:
The Programmer's File Format Collection
http://www.wotsit.org/
 
我想把公司的文档都放在数据库里,调阅和修改的时候把文档从数据里读出来,在本地硬盘
上生成一个文件,修改完了在把文件读到数据库里,然后把硬盘上生成的临时文件再删除。
所以就遇到了这个问题,存的时候我知道是什么文件,可读的时候就难以判断了。
不是每种文件的文件头里都有几个字节是表识这个文件是什么格式的么,可在BLOB里我怎么
才能抓到这几个字节?
 
抓前几个字节出来就是把刚才那个 aMemoryStream 中前几个字节读出来就可以了,
不过判断文件头可是很辛苦的,你需要知道几乎所有可能的文件头,绝对复杂!!
你要是保存的时候就把文件类型保存进去了,读的时候直接根据这个类型来判断,
不是方便的多?!!
 
呵呵,还是变通的方法。
但是就算把文件的后缀另用一个字段来说明的话,还有版本的问题,除了文件里面那几个
表识文件类型的字节,其他的还真没什么好办法。
 
老兄,写程序的时候就是需要变通!否则很有可能南辕北辙!不骗你!
或者可以这么说,那本来就是正确的方法,可是你一开始并没有走到
正确的路上,可是你又不愿意转弯,那我还能怎么说? [:(]
要是不相信,你听其他富翁的说法吧,最终你会明白的:)
 
我想再提一下:
我最开始的回复,虽然只有9个字,但我认为那是解决你现在
的问题的最佳,最快捷的方法,因为你的重点是在管理,不是
文件格式分析,没有必要去判断,只要读出你的标识就可以。
--》每种文件的文件头里都有几个字节是表识这个文件是什么格式的么
这是错误的,不知你这个认识是怎么来的。文件格式由于历史原因,
千差万别,难以统一。
先去看看我给你的站点,你就有更深的认识了。
 
顶部