一个内存流
我需要顺序存储不同的东西
比如:1、 ……(前面存储的一系列数据)
2、 一个integer型的数值,为后面的数据长度
3、 从Bitmap对象写入的图片信息
4、 ……(后面存储的其他数据)我程序中,写数据都完成了,通过内存流的游标知道,这里的Bitmap数据大约有300K左右。读取代码中
(1)部分读取完全成功
(2)部分读取正确,长度数值正确
(3)部分报错。可能是我的方法有误,有高手能帮帮我么?大致代码如下:
TForm1 = class(TForm)
public
obj:TMemoryStream;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
obj:=TMemoryStream.Create;
end;procedure TForm1.Button1Click(Sender: TObject);
var k,iLen:integer; bmp:TBitmap;
begin
bmp:=TBitmap.Create;
obj.Clear;
//obj.Write(.....);//前面存储了很多数据
k:=obj.Position;
obj.Write(iLen,sizeof(iLen));
bmp.Assign(image1.Picture.Bitmap);
bmp.SaveToStream(obj);
iLen:=obj.Position-k-4; //int型的长度有4个字节
//obj.Write(.....);//后面也存储了很多数据
obj.Position:=k;
obj.Write(iLen,sizeof(iLen)); //重些bmp数据长度
freeAndNil(bmp);
end;procedure TForm1.Button2Click(Sender: TObject);
var k,iLen:integer; bmp:TBitmap;
begin
bmp:=TBitmap.Create;
obj.Position:=0;
//obj.Read(....) //读取前面存储的数据等语句
obj.Read(iLen,sizeof(iLen));
obj.Read(bmp,iLen); //////////////////////////////【这里报错】
//obj.Read(....) //读取后面存储的数据等语句
image2.Picture.Bitmap:=bmp;
end;
我需要顺序存储不同的东西
比如:1、 ……(前面存储的一系列数据)
2、 一个integer型的数值,为后面的数据长度
3、 从Bitmap对象写入的图片信息
4、 ……(后面存储的其他数据)我程序中,写数据都完成了,通过内存流的游标知道,这里的Bitmap数据大约有300K左右。读取代码中
(1)部分读取完全成功
(2)部分读取正确,长度数值正确
(3)部分报错。可能是我的方法有误,有高手能帮帮我么?大致代码如下:
TForm1 = class(TForm)
public
obj:TMemoryStream;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
obj:=TMemoryStream.Create;
end;procedure TForm1.Button1Click(Sender: TObject);
var k,iLen:integer; bmp:TBitmap;
begin
bmp:=TBitmap.Create;
obj.Clear;
//obj.Write(.....);//前面存储了很多数据
k:=obj.Position;
obj.Write(iLen,sizeof(iLen));
bmp.Assign(image1.Picture.Bitmap);
bmp.SaveToStream(obj);
iLen:=obj.Position-k-4; //int型的长度有4个字节
//obj.Write(.....);//后面也存储了很多数据
obj.Position:=k;
obj.Write(iLen,sizeof(iLen)); //重些bmp数据长度
freeAndNil(bmp);
end;procedure TForm1.Button2Click(Sender: TObject);
var k,iLen:integer; bmp:TBitmap;
begin
bmp:=TBitmap.Create;
obj.Position:=0;
//obj.Read(....) //读取前面存储的数据等语句
obj.Read(iLen,sizeof(iLen));
obj.Read(bmp,iLen); //////////////////////////////【这里报错】
//obj.Read(....) //读取后面存储的数据等语句
image2.Picture.Bitmap:=bmp;
end;
解决方案 »
- TWideStringList怎么查不到值?
- delphi背景图片问题
- 在现在的英文版xp上,好多软件的中文可以显示,为何我用delphi写的中文就是乱码?
- 向一个表插入记录,为何报错Missing operator or semicolon
- 为什么在ToolBar上放10个ToolButton, 只显示前五个, 而且在显示时有一定的延迟?
- 请教关于ThemeEngine控件的一些基本问题
- 能贴一个简单的delphi写的asp组件的代码吗?
- 请问Delphi中如何把HMenu句柄转化为TPopupMenu对象?
- fast report memo脚本
- 模拟鼠标后台点击的问题
- 宇宙超级无敌赛亚人
- IdHttp 提交Cookie做模拟登录
bmp:=TBitmap.Create;
obj.Position:=0;
//obj.Read(....) //读取前面存储的数据等语句
obj.Read(iLen,sizeof(iLen));
edit2.Text:=inttostr(iLen);
ms.CopyFrom(obj,iLen);
bmp.LoadFromStream(ms);但是,若无图片数据以外的其余部分,图片能正常通过内存流复制到image2中。
通过代码发现流内图片区域的数据长度是正确的。请问哪里错了 该如何处理?
obj.Read(iLen,sizeof(iLen));
obj.Read(bmp,iLen);
这种方式为啥不行。呵呵 明天结贴。
看看能不能有人知道这个问题。
bmp.SaveToStream(obj);你跟代码进去就会发现了,代码太多,这里我就不给你贴了
function Read(var Buffer; Count: Longint): Longint;
procedure WriteBuffer(const Buffer; Count: Longint);注意上面的读写中与 stream 交换数据的 Buffer 是一块内存空间, 可以为基本数据类型: byte, Integer, string[20], 指定长度(setLength)的动态字节(或char)数组, 或已知size 的 struct 等.
再对照检查一下代码中使用到的 read和 wirte 中的 Buffer 是否符合.
可不可以用TLIST?
读的时候把对应部分弄到单独的流中,然后让TBitmap来LoadFromStream
这里要通过一个缓存区转换:
先定义一个流对象:
var
objtemp: TMemoryStream;
..
objtemp := TMemoryStream.Create;
objtemp.CopyFrom(obj, iLen);
bmp.LoadFromStream(objtemp);