一个非常难的问题,答上者重酬!! 关于读取图片的问题. ( 积分: 200 )

  • 主题发起人 主题发起人 greatljp
  • 开始时间 开始时间
G

greatljp

Unregistered / Unconfirmed
GUEST, unregistred user!
最近我们公司将以前的旧系统(VFP写的)转换为新系统(用DELPHI写),就遇到一个技术难题:如何将VFP存在SQL数据库中的图片,现在用DELPHI调出来?
就是说SQL中的图片数据以前是用VFP存进去的,现在改为用DELPHI写了,但无法将以前的图片调出来转存为DELPHI格式的,使之能显示出来?
....
我想我要补充一点:SQL数据库的IMAGE字段里的数据(在VFP中調用圖象文件,用VFP的通用类型(G)存进去的),用VFP的'OLE Bound Control'控件可以显示出图片,但用DELPHI却无法显示出来.求助希望能在DELPHI中显示出来....
不知各位大虾有何高招?如有大虾答出一二,小弟这边重酬了...
 
最近我们公司将以前的旧系统(VFP写的)转换为新系统(用DELPHI写),就遇到一个技术难题:如何将VFP存在SQL数据库中的图片,现在用DELPHI调出来?
就是说SQL中的图片数据以前是用VFP存进去的,现在改为用DELPHI写了,但无法将以前的图片调出来转存为DELPHI格式的,使之能显示出来?
....
我想我要补充一点:SQL数据库的IMAGE字段里的数据(在VFP中調用圖象文件,用VFP的通用类型(G)存进去的),用VFP的'OLE Bound Control'控件可以显示出图片,但用DELPHI却无法显示出来.求助希望能在DELPHI中显示出来....
不知各位大虾有何高招?如有大虾答出一二,小弟这边重酬了...
 
存在数据库中应该没有什么vfp,delphi格式,在sql server中格式应该为二进制的,用TBlobField应该可以读取吧
 
你VFP中是怎么写的呢?是用流的方式存入的吗,你说清楚些
 
用TBlobField来读取:
const
WMFKey = Integer($9AC6CDD7);
WMFWord = $CDD7;
rc3_StockIcon = 0;
rc3_Icon = 1;
rc3_Cursor = 2;

type
TGraphicHeader = record
Count: Word;
HType: Word;
Size: Longint;
end;

TMetafileHeader = packed record
Key: Longint;
Handle: SmallInt;
Box: TSmallRect;
Inch: Word;
Reserved: Longint;
CheckSum: Word;
end;

TCursorOrIcon = packed record
Reserved: Word;
wType: Word;
Count: Word;
end;
//------------------------------------------------------
// Created: 2005-06-12
// Author: jfyes
// Type: procedure
// Function: DrawFieldGraphic
// Description:
// Update: by xxx
// Example: DrawFieldGraphic(TBlobField(Qy1.FieldByName('IMage')), Image1.Picture)
//------------------------------------------------------
procedure DrawFieldGraphic(BlobField: TBlobField; Picture: TPicture);
var
s: TStream;
pos: Integer;
Header: TGraphicHeader;
BMPHeader: TBitmapFileHeader;
//{$IFDEF JPEG}
JPEGHeader: array[0..1] of Byte;
//{$ENDIF}
EMFHeader: TEnhMetaHeader;
WMFHeader: TMetafileHeader;
ICOHeader: TCursorOrIcon;
NewGraphic: TGraphic;
begin
if BlobField.IsNull then
begin
Picture.Assign(nil);
Exit;
end;
s := nil;
try
S := BlobField.DataSet.CreateBlobStream(BlobField, bmRead);
NewGraphic := nil;
if s = nil then Exit;
if s.Size > 0 then
begin
// skip Delphi blob-image header
if s.Size >= SizeOf(TGraphicHeader) then
begin
s.Read(Header, SizeOf(Header));
if (Header.Count <> 1) or (Header.HType <> $0100) or
(Header.Size <> s.Size - SizeOf(Header)) then
s.Position := 0;
end;
pos := s.Position;

// try bmp header
s.ReadBuffer(BMPHeader, SizeOf(BMPHeader));
s.Position := pos;
if BMPHeader.bfType = $4D42 then
NewGraphic := TBitmap.Create
else
begin
//{$IFDEF JPEG}
// try jpeg header
s.ReadBuffer(JPEGHeader, SizeOf(JPEGHeader));
s.Position := pos;
if (JPEGHeader[0] = $FF) and (JPEGHeader[1] = $D8) then
NewGraphic := TJPEGImage.Create
else
//{$ENDIF}
begin
// try wmf header
s.ReadBuffer(WMFHeader, SizeOf(WMFHeader));
s.Position := pos;
if WMFHeader.Key = WMFKEY then
NewGraphic := TMetafile.Create
else
begin
// try emf header
s.ReadBuffer(EMFHeader, SizeOf(EMFHeader));
s.Position := pos;
if EMFHeader.dSignature = ENHMETA_SIGNATURE then
NewGraphic := TMetafile.Create
else
begin
// try icon header
s.ReadBuffer(ICOHeader, SizeOf(ICOHeader));
s.Position := pos;
if ICOHeader.wType in [RC3_STOCKICON, RC3_ICON] then
NewGraphic := TIcon.Create;
end;
end;
end;
end;
end;

if NewGraphic <> nil then
begin
Picture.Graphic := NewGraphic;
NewGraphic.Free;
Picture.Graphic.LoadFromStream(s);
end
else
Picture.Assign(nil);
finally
if s <> nil then
s.Free;
end;
end;
 
楼上写的我没有仔细看,但大体上应该是了。

也就是用DELPHI中的流(TStream)来实现写入和读出操作!
 
To: King.gray
SQL数据库的图片数据是用VFP的通用类型(G)存进去的,在VFP中可以用OLE控件显示出来,但在DELPHI中用IMAGE显示时发生错误.因为VFP和DELPHI两者存进去的数据不一致,以致无法显示.
我先试下JFYES的方法.
 
找delphi中用ole存取图片的代码(旧贴中有)。用TBlobField法可能不行。
 
在delphi中用OLE container来显示图片.
OleContainer.loadFromStream
 
我可以在delphi中直接将图片导进SQL数据库,但是不知道怎么将一条信息中的图片修改替换成另外一张,或者在一条已经存在的无图片的信息中把图片加上去
 
谢谢各位的关注,但我用了各位的方法,仍然出现'error read stream'错误.
我想我要补充一点:SQL数据库的IMAGE字段里的数据,用VFP的'OLE Bound Control'控件可以显示出图片,但用DELPHI却无法显示出来.求助希望能在DELPHI中显示出来....
 
在delphi中安装VFP的'OLE Bound Control'控件
 
按二进制读出,保存为JPG文件,再打开JPG文件。
 
多人接受答案了。
 
后退
顶部