请高手帮我分析一下这小段代码(100分)

  • 主题发起人 主题发起人 wzwcn
  • 开始时间 开始时间
W

wzwcn

Unregistered / Unconfirmed
GUEST, unregistred user!
var mystream:tstream;
begin
ystream:=tstream.create;
image1.picture.bitmap.savetostream(mystream);
………………
mystream.free;
end;
我想反一个在image1中的图像写入流中,但这样做老出错,不知道错在哪里,为什么不能这样写,如果不这样写应该怎么写?
 
ystream:=tmemorystream.create;
 
//转来的,以前的答案中的,你看看???
提供以下例程,仅供参考:
unit blobFun;
////////////////////////////////////////////////////////////////////
//有关blob字段的读写操作公共函数
////////////////////////////////////////////////////////////////////
interface
uses classes,db,dbtables,graphics;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:IMAGE字段的读写操作
function gfWriteDataToBlobField(bIndex,eIndex:integer;data:array of double;var fieldObject:TBlobField):boolean;
function gfReadDataFromBlobField(bIndex,eIndex:integer;var data:array of double;fieldObject:TBlobField):boolean;

function gfWriteImageToBlobField(bitmapObject:TBitmap;var fieldObject:TBlobField):boolean;
function gfReadImageFromBlobField(var bitmapObject:TBitmap;fieldObject:TBlobField):boolean;

implementation

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:从IMAGE字段中读取数据到数组中
//输入: data:实型数组 bIndex,eIndex:数组起止索引 fieldObject:与IMAGE字段对应的fieldObject对象
//输出:fieldObject对象数据将被修改 返回成功标志TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gfWriteDataToBlobField(bIndex,eIndex:integer;data:array of double;var fieldObject:TBlobField):boolean;
var
bufferLen:integer;
dataStream:TMemoryStream;
begin
//check parameters:
// Assert((data<>nil) AND (fieldObject<>nil),'Parameters error in gfReadDataFromBlobField()!');
Assert(eIndex>=bIndex,'Parameters error in gfReadDataFromBlobField()!');

Result:=true;
//make memory stream
bufferLen:=sizeof(double)*(eIndex-bIndex);
dataStream:=TMemoryStream.Create;
dataStream.SetSize(bufferLen+1);
//write data into memory stream
dataStream.Write(data,bufferlen);
//write data into field object from memory stream
try
fieldObject.LoadFromStream(dataStream);
except
Result:=False;
end;


dataStream.free;
end;



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:从IMAGE字段中读取数据到数组中
//输入: data:实型数组 bIndex,eIndex:数组起止索引 fieldObject:与IMAGE字段对应的fieldObject对象
//输出:data数组中数据将被修改 返回成功标志TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gfReadDataFromBlobField(bIndex,eIndex:integer;var data:array of double;fieldObject:TBlobField):boolean;
var
bufferLen:integer;
dataStream:TMemoryStream;
myBlobStream:TBlobStream;
begin
//check parameters:
// Assert((data<>nil) AND (fieldObject<>nil),'Parameters error in gfReadDataFromBlobField()!');
Assert(eIndex>=bIndex,'Parameters error in gfReadDataFromBlobField()!');

Result:=true;
//make memory stream
bufferLen:=sizeof(double)*(eIndex-bIndex);
dataStream:=TMemoryStream.Create;
dataStream.SetSize(bufferLen+1);

try
begin
//make blob stream
myBlobStream:=TBlobStream.Create(fieldObject,bmRead);

//read data from blob stream to memory stream
dataStream.LoadFromStream(myBlobStream);
end
except
begin
Result:=false;
end
end;

//read data into data array from memory stream
if Result then dataStream.Read(data[bIndex],bufferlen);
dataStream.Free;
end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:从IMAGE字段中读取数据到image对象中
//输入: bitmapObject:图形对象 fieldObject:与IMAGE字段对应的fieldObject对象
//输出:fieldObject数据将被修改 返回成功标志TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gfWriteImageToBlobField(bitmapObject:TBitmap;var fieldObject:TBlobField):boolean;
var
bufferLen:integer;
dataStream:TMemoryStream;
begin
//check parameters:
Assert(((bitmapObject<>nil) AND (fieldObject<>nil)),'Parameters error in gfReadDataFromBlobField()!');

Result:=true;
//make memory stream
bufferLen:=sizeof(bitmapObject);
dataStream:=TMemoryStream.Create;
dataStream.SetSize(bufferLen+1);
//write data into memory stream
bitmapObject.SaveToStream(dataStream);

//write data into field object from memory stream
try
fieldObject.LoadFromStream(dataStream);
except
Result:=False;
end;


dataStream.free;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能:从IMAGE字段中读取数据到image对象中
//输入: bitmapObject:图形对象 fieldObject:与IMAGE字段对应的fieldObject对象
//输出: bitmapObject数据将被修改 返回成功标志TRUE
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function gfReadImageFromBlobField(var bitmapObject:TBitmap;fieldObject:TBlobField):boolean;
var
myBlobStream:TBlobStream;
begin
//check parameters:
Assert((bitmapObject<>nil) AND (fieldObject<>nil),'Parameters error in gfReadDataFromBlobField()!');

Result:=true;
//make memory stream
try
begin
//make blob stream
myBlobStream:=TBlobStream.Create(fieldObject,bmRead);

//read data from blob stream to memory stream
bitmapObject.LoadFromStream(myBlobStream);
end
except
begin
Result:=false;
end
end;

//read data into data array from memory stream
myBlobStream.Free;
end;
end.

 
我也像楼上说的做过,运行是没出错了,但我这样读又读不出来:
image1.picture.bitmap.loadfromstream(mystrem);
我怎么办才能又让图片在图片框里显示出来?
 
jpegimage := tjpegimage.Create ;
try //try12
jpegimage.LoadFromStream(mystrm);
image1.Picture.Graphic := jpegimage;
finally
jpegimage.Free ;
end; //end try12
 
在用之前mystrem可不能free了^_^
 
多人接受答案了。
 

Similar threads

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