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

  • 主题发起人 主题发起人 SEVN
  • 开始时间 开始时间
各位哥们:
我不是钻牛角尖,我只是想把这当做一个可以讨论的技术问题来寻求好办法的。
其实在应用的时候我也是用几个字段来存储诸如文件格式,文件版本,文件所有者等信息,
但我不认为那是最佳的方案,如果从纯技术的角度来看的话。
不知道各位怎么理解?
 
// 我只是想把这当做一个可以讨论的技术问题来寻求好办法的。
可是我们的确是给你提供了方法,可是你认为那是不入流的替代方法:(
Sorry,以我的脑袋暂时想不出更好的办法,用不用随你了[:(]
 
哥们,别这样说,说的我都不好意思了。
我提这个问题,就是为了讨论。就是为了多找几个办法。
来者是客嘛,要是我有不礼貌的,或者让老兄觉得不爽的,只管骂我就是了,小的听训。
呵呵。
 
呵呵,我不是这个意思,我的意思是觉得你好像不想接受你认为不正规的方法,
或者是想等一个和你的方法同一个思路的方法,这本身并没有什么,不过不接受
其他意见或者说不愿意接受就···
祝你能等到你想的方案。
 
我想听听:你看了我给的那个网站后有什么想法。
 
Windows 的机制都是通过后缀名来判断的,你比老盖还牛,
我写个文件格式你肯定判断不出来,
 
一般文件在前面100多个字节里进行了表示
可以从这里入手么
 
如果你就想用一个字段搞定的话,自己在写入之前加上定长的几个字节做为标志,读该字段时
先读出这几个字节,再读其后的数据。至于分析文件的方法也可以,不过我想你的工作重点是
不应该放在这里的.
 
想看TImage的判断是如何完成的,多看VCL源代码很有帮助的
 
image这样的字段应该是没有什么格式的,除非你以文件方式存在BLOB里,才能保住“格式”
 
在往里写的时候,自己做个N字节的头不就得了!
 
如果字段是用Delphi的DBImage装入数据的,是可以判断的,Delphi中TBlob字段会自动为图片数据加上一个头
头的记录类型是TGraphicHeader定义如下:
type
TGraphicHeader = record
Count: Word;
{ Fixed at 1 }
HType: Word;
{ Fixed at $0100 }
Size: Longint;
{ Size not including header }
end;

因为Delphi内置只支持BMP,其实就是读取这个头,在Delphi内置支持的代码中,
Count始终为1,HType始终为$0100,Size则是图片数据流的长度.
你可以把每一个Blob字段的数据读出来,然后取其前面的Sizeof(TGraphicHeader)
个字节的数据存到一个TGraphicHeader类型的记录中,然后再判断是否是相应的文件格式.
 
不过如果是直接调用TBlobField的LoadFromFile方法装入图片则没有这个数据头,通过DBImage.Picture的LoadFromFile方法就有.
如果没有这个头那就只有读文件头,BMP格式和JPG格式分别有不同的文件头,至于这个文件头的什么内容那可是麻烦了,楼上已经
提到你可以找相关图片格式的资料,你可以在网上找找.
但是TXT文件是没有文件头的,所以理论上是不可能判断一个流是否是文本.
不过如果数据也是你的程序写入的,那你也可以在字段的头部写入一个数据头,以便读出的时候分别处理.
procedure LoadFromStream(BlobField;TBlobField;Stream: TStream);
var
Header: TGraphicHeader;
BlobStream: TStream;
begin
BlobStream := DataSet.CreateBlobStream(Self, bmWrite);
try
Header.Count := 1;
if BMP文件 then
Header.HType := $0100
else
if JPG文件 then
Header.HType := $0101
else
if WORD文件then
Header.HType := $0102
else
if TXT文件 then
Header.HType := $0103;
......
Header.Size := 0;
BlobStream.Write(Header, SizeOf(Header));
Stream.SaveToStream(BlobStream);
Header.Size := BlobStream.Position - SizeOf(Header);
BlobStream.Position := 0;
BlobStream.Write(Header, SizeOf(Header));
finally
BlobStream.Free;
end;
end;
 
如果是图型的话,有一种最好的方法就是用RTTI
先将字段的内容存到一个TGraphics类,然后用这个类的ClassType.ClassName就可以取得
是TIcon还是Bmp或是TJpeg了,所有的虚构函数实现都是用到RTTI完成的
至于其他类型文档,暂进没什么好方法,可以用一个流先在头几个字节放入文档格式,然后
再将文档存进去,然后再存入数据库,解的时候先取出格式,再读出来就行了
 
补充:先用一个结构 type filetype = record
filetype: string(10);
fileversion: string(20);
end;

先建立一个TFileStream, 取得文件
var
tempfiletype: filetype;
tempfilestream: tfilestream;
begin
tempfiletype.filetype := '.doc';
tempfiletype.fileversion := '2000';
tempfilestream := tfilestream.create;
tempfilestream.write(tempfiletype,sizeof(filetype));
//再将你所要的文件也放入这个流,然后将这个流存入数据库,读出来反知,先取
   得类型,然后存出来就行了
end;
 
转了半天又回到存下类型的老路,
看上面的回帖,楼主早已否决了。
 
那就让MS给你所有win支持的文件头类型进行判断吧
 
在数据库表的一个BLOB行字段里,存放了.jpg .bmp .ico等等格式的图片,
读出来显示的时候怎么才能知道图片的格式类型?
如果字段里存放的是.doc .txt .*** 等等格式的文件呢?读出来的时候怎么才能知道
字段里存放的是什么格式的什么东西?
征询各种方法,不论优劣,只要可能实现的都讲一讲。
这个问题纯粹从技术实现上来讨论,不考虑应用。
谢谢各位参与,来者有份(分),只要您想到的方法,就说说吧。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部