怎样显示该图片 ( 积分: 200 )

  • 主题发起人 主题发起人 cghzzw
  • 开始时间 开始时间
C

cghzzw

Unregistered / Unconfirmed
GUEST, unregistred user!
我的图片存储在数据库的数据如下:
0x151C2E00020000000E000C0014002200F701CEFE56697375616C20466F7850726F004D5350686F746F45642E330001050000020000000C0000004D5350686F746F45642E3300000000000000000000760200D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF090006000000000000000000000003
在foxpro下用通用字段显示没有问题,我在delphi下用了流读取方式时总是提示流读取错误,要不就是不识别该图象格式,各位大虾们请帮忙看看我该怎么样才能实现?
 
我的图片存储在数据库的数据如下:
0x151C2E00020000000E000C0014002200F701CEFE56697375616C20466F7850726F004D5350686F746F45642E330001050000020000000C0000004D5350686F746F45642E3300000000000000000000760200D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF090006000000000000000000000003
在foxpro下用通用字段显示没有问题,我在delphi下用了流读取方式时总是提示流读取错误,要不就是不识别该图象格式,各位大虾们请帮忙看看我该怎么样才能实现?
 
你往foxpro里存时是以什么方式存的?做了什么处理没有?
 
foxpro使用了ole连接方式。没有做其他的处理。
 
delphi下用了流读取方式
代码是如何的,贴出来看一下,

或者你参照一下这个例子看看:
一个利用TBlobStream在数据库中保存BMP和JPG图片的例子,可同时支持这两种格式的图片,并且涉及到利用DBGrid的自绘事件在DBGrid中绘制图片的技巧(使用了Delphi自带的DBDEMOS数据库中的Animals.dbf数据表,SQL数据和本地DBF数据库的操作是一样的)。
http://www.aidelphi.com/6to23/Docu/BlobStream.zip
 
用TADOBlobStream取出来只有,用TPicture去LoadFromStream

var
PictureStream:TADOBlobStream;
Pic:TPicture;
begin
PictureStream:=TADOBlobStream.Create(ADOTable1.FieldByName('照片') as TBlobField,BMRead);
pic:=TPicture.Create;
try
Pic.LoadFromStream(PictureStream);
Pic.SaveToFile('c:/a.bmp');// 什么名字没关系,先取出来,然后用记事本打开,看看文件头,
finally
PictureStream.Free;
Pic.Free;
end;
end;

如果你自己知道存进去的类型就好办了,SQL 里面存的image字段也是0x打头,但是我用Delphi的流方式存,其他人用VB和VC一样可以读,应该是通用的方式
 
to :chenybin
我在編譯的時候提示
[Error] Unit1.pas(41): Undeclared identifier: 'LoadFromStream'
請問出現該提示該怎麼處理,謝謝!
to:app2001
我看了你的程序,對一般的圖片沒有問題,但我的數據庫裡的圖片還是讀不出來,提示為error pictrue。不管如何,謝謝你!
 
不好意思,弄错了TBitmpa才有。

那就干脆把文件写出来算了,用TMemoryStream拷贝出来

var
PictureStream:TADOBlobStream;
MS:TMemoryStream;
begin
PictureStream:=TADOBlobStream.Create(ADOTable1.FieldByName('照片') as TBlobField,BMRead);
MS:=TMemoryStream.Create;
try
PictureStream.Position := 0;
MS.CopyFrom(PictureStream, PictureStream.size);
MS.Position := 0;
MS.SaveToFile('c:/a.bmp');// 什么名字没关系,先取出来,然后用记事本打开,看看文件头,
finally
PictureStream.Free;
MS.Free;
end;
end;
 
再看看下面这些呢,有没敢有用
http://www.delphibbs.com/keylife/iblog_show.asp?xid=12297
KeyLife富翁笔记
作者?: kaolasoft
标题?: DELPHI 存取四种图形格式(BMP、EMF、WMF、ICO、JPEG) 到SQL Server 数据库
http://www.delphibbs.com/keylife/iblog_show.asp?xid=16759
KeyLife富翁笔记
作者?: jhlz1968
标题?: 数据库中图片操作(收藏)
关键字: 图片操作
分类?: 个人专区
密级?: 公开
(评分: , 回复: 0, 阅读: 72) »»
把BMP,JPG图片保存到数据库中及从数据库中取出来显示在iamge上.
 
在你的数据库当中保存的整个数据流是一个OLE的流,他在前面添加了东西,因此系统可以根据这个OLD流,知道应该由哪个OLE对象来打开他,其数据格式主要是在前边添加了一个前缀.
至于具体格式是什么样子,有什么对应的Win32API,这个我也不清楚.
不过对于一般的常见各式的图片,你其实可以直接扫描关键,比如BMP图片的BM.然后结合各种图片的具体格式标准,如果能够正确打开,那么你必然是找对了.前边那个多余的文件头,一般也就是几十个字节.你可以用ULTRAEDIT看到你所贴出的二进制对应的是一个MSPhotoEd.3的OLE对象.不过这似乎不是一个完整的数据。
var
stream : TMemoryStream;
pChr : PChar;
iPos : Integer;
bFlag:= bool;
bm: TBItmap;
begin
stream:= TADODataSet.CreateBlobStream(...) as TMemoryStream;
pChr := stream.Memory; bFlag:= false;
for iPos:=0 to stream.size-2 do
if (pChr[iPos]='B') and (pChr[iPos+1]='M') then
begin
stream.Position:= iPos;
bFlag:= true;
break;
end;
if (bFlag) then
begin ......
try
bm.LoadFromStream(stream);
except
....
end;
end;
 
bitmap.LoadFromStream(stream);
 
我的主要目的是搞清楚你是什么格式的图片,如果知道格式了简单了

如果知道是ICON,就用TIcon,如果是BMP,即用TBitmap,如果是Jpj就用TJgepImage等等,我以前存icon,结果也是0x开头,但是我想应该可以判断Stream头,可惜我不会,所以才用存Stream的方法[:D][:D]
 
你存入的图片是 jpg 格式,我也遇到这样的错误,要想存入 jpg 格式,可就麻烦了
你可以先通过TJPEGImage类 进行中间过度,然后通过Image组件的Canvas 属性绘制出JPEG 图像。
 
刚刚分析了你给的文件头,

$15,$1c,就是BMP图片,所以你就按我说的,把图片存出来就可以看内容了,另外也完全可以在程序里面用DBImage来读取,好运
 
这个问题我解决的很好。我可以把 bmp ,jpg ,ico ,wmf ,gif 等怎么存进去在怎么取出来。图象格式不变化。存入就不说了。都是存二进制。关键是取。去出后要判断是什么格式。比如$15,$1c,就是BMP图片就用对应的格式打开显示。
 
to chenybin,app2001
問題已經解決了,可是我該怎麼給你們加分呢?其他帖子可以直接分配,為什麼這個帖子我看不到,我要怎樣才能給你們。
謝謝
 
听你这么说,我都要哭了,你不是逗我们玩吧,就下面回话的编辑框上面不是有一些显示我们名字的后面跟着些EDIT编辑框吗,那就是分配分数的啊,嘿嘿
 
楼主,你给分的时候一定要小心阿,有个单选框,如果设置错了就全部给app2001了,最下面那个单选框,然后分配分数,然后点发出就可以了,早上有位兄弟就是把分全部给了app了,痛哭……

如果你不会,可以留下QQ,我告诉你(我已经承受不住打击了,已经因为这种情况丢了几千分了)
 
呵呵,对chenybin说的非常好。
app2001这个名字太靠前了,
改天我起个名字以“aaa"开头的,这样肯定派第一了:)
哎,我的名字为中文,并且在中文中也是靠后的。
为什么这样啊!!!!!

:)
 
嘿,也许偶尔有这样的事发生,但我可没耍赖,你们别看不开啊,又没人限你们不可改名的,你若改成数字打头的,还会往前排呢.
 
后退
顶部