关于流操作。。。。。。。。。。(50分)

  • 主题发起人 主题发起人 jdsky
  • 开始时间 开始时间
J

jdsky

Unregistered / Unconfirmed
GUEST, unregistred user!
1、如何将一个图片作为流Stream:TMemoryStream的一部分,拼凑到流里面去
我用了stream.write,可不知道图片有没有到流里面去
2、如何把一个流Stream1:TMemoryStream中的一部分读到另外一个Stream2:TMemoryStream
中去。
 
1、MemoryStream1.LoadFromFile('1.jpg')
2、MemoryStream2.CopyFrom(MemoryStream,Size)
 
kingdeezj谢谢你的回答,可能你还没有明白我的意思
我已经把一个图片放到了一个流里面,就象你说的MemoryStream1.LoadFromFile('1.jpg')
,现在我要做的是把MemoryStream1作为MemoryStream2的一部分(MemoryStream2还有其他
内容,把MemoryStream1拼凑进MemoryStream2),然后把MemoryStream2存入数据库
 
memorystream1.loadfromfile('1.jpg');
memorystream2.position(memorystream2.size);
memrysteam.copytomemory(memorystream2,size);
 
jiajiajia888,你的方法好象不对嘛
 
//移动到stream的首位
bStream.seek(0,soFrombegin
ning);
//清空流数据
if bStream.Size<>0 then
bStream.truncate;
//将filestream的内容拷贝到blobstream
bStream.copyfrom(fStream,fStream.size);
//释放流
fStream.free;
bStream.free;
 
这个好像不太难啊。可以这样,建立两个TMemoryStream流A,B。
每次先将图象1,存入A中,A.size就是图象1的长度,记下来。在流B中先写入刚才图象1的
长度,再将流A中的全部图象1的数据拷贝到流B中。将流A清空,以同样的方法将图象2拷贝
到流B中图象1的后面,这样保存几个随你便。在读出的时候,先将第一个流的长度读出来,
根据这个长度去读图象,依此类推,不是很好吗![:D][:D]
 
我已经记下了图片的长度,给你们看看我的程序吧:
var
Buffer: array of Pchar;
Stream,MemoryStream: TMemoryStream;
Size: Int64;
begin
Stream := TMemoryStream.Create;
MemoryStream := TMemoryStream.Create;
TImage.Picture.Bitmap.SaveToStream(MemoryStream);
Size := MemoryStream.Size;
SetLength(Buffer,Size);
MemoryStream.Read(Buffer,Size);
Stream.Write(Buffer,Size);
//可是做到这里Buffer为空了,没有把MemoryStream中
//的东西装入Stream
end;
 
var
Buffer: array of Pchar;
Stream,MemoryStream: TMemoryStream;
Size: Int64;
begin
Stream := TMemoryStream.Create;
MemoryStream := TMemoryStream.Create;
TImage.Picture.Bitmap.SaveToStream(MemoryStream);
Size := MemoryStream.Size;
SetLength(Buffer,Size);
memorystream.position:=0;//要不然流指针指向的流尾,当然读不出东西来了
MemoryStream.Read(Buffer^,Size);//注意^不能少,下同
Stream.Write(Buffer^,Size);
//可是做到这里Buffer为空了,没有把MemoryStream中
//的东西装入Stream
end;
 
远帆:
MemoryStream.Read(Buffer^,Size);//编译时报错
 
var
Stream,MemoryStream: TMemoryStream;
Size: Integer;
begin
Stream := TMemoryStream.Create;
MemoryStream := TMemoryStream.Create;
TImage.Picture.Bitmap.SaveToStream(MemoryStream);
Size := MemoryStream.Size;
Stream.Write(Size,sizeof(Integer));
MemoryStream.Position := 0;
Stream.CopyFrom(MemoryStream, Size);
//到这里第一个图象装完了
 
Sorry,应该是:
var
Buffer: PChar ;
Stream,MemoryStream: TMemoryStream;
Size: Int64;
begin
Stream := TMemoryStream.Create;
MemoryStream := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(MemoryStream);
Size := MemoryStream.Size;
GetMem(Buffer,Size);
try
memorystream.position:=0;//要不然流指针指向的流尾,当然读不出东西来了
MemoryStream.Read(Buffer^,Size);//注意^不能少,下同
Stream.Write(Buffer^,Size);
//可是做到这里Buffer为空了,没有把MemoryStream中
//的东西装入Stream
finally
FreeMem(Buffer);
end;
 
你的那个array of pchar是错误的。
pchar是指针,array of pchar是指针数组,与你的代码不符。
 
var
TmpMS, ImgMS: TMemoryStream;
iImgSize: Integer;
begin
TmpMS := TMemoryStream.Create;
ImgMS := TMemoryStream.Create;
TmpMS.LoadFromFile('图象文件名');
//随便什么格式的文件,都无所谓
iImgSize := TmpMS.Size;
ImgMS.Write(iImgSize, sizeof(Integer));
//写入第一个图象的大小
TmpMS.Position := 0;
ImgMS.CopyFrom(TmpMS, iImgSize);
//将第一个图象从临时流中拷贝过来
TmpMS.SetSize(0);
//清空临时流
{ 重复刚才的步骤 }
TmpMS.LoadFromFile('图象文件名');
iImgSize := TmpMS.Size;
ImgMS.Write(iImgSize, sizeof(Integer));
TmpMS.Position := 0;
ImgMS.CopyFrom(TmpMS, iImgSize);
{ 反复上面的过程可保存多个图象 }
//----------------------------------------------------
{ 读取数据,为了省事,就都放在这里了 }

ImgMS.Position := 0;
ImgMS.Read(iImgSize, sizeof(Integer));
ImgMS.Read(某变量, iImgSize);
//这里你要显示,还是保存,随便了
TmpMS.Free;
ImgMS.Free;
end;
 
谢谢远帆和小笨笨的回答,我已经搞定了
 
后退
顶部