小弟有数个关于流的小问题。
我创建了一个MemoryStream,是一个位图数据,我现在使用了一个Read(var Buffer; Count: Longint)函数。
1:参数 Buffer 可以为哪些类型?我现在用的是一个一维数组没有,可是二维数组就不行,变长的一维数组也要报错。
2:把数据放入 Buffer 中是什么方式?是把流中数据一个一个的COPY一个放到数组中还是把流的内存地址赋给 Buffer ?我现在是一次性要读取三十多万个字节,但是只用了十几豪秒,如果是COPY的话是不是没有那么快啊?如果只是赋的地址,我把流释放了也还可以访问数组,是不是流的释放并没有破坏具体的数据?我现在是上定义了一个三十万字节长度的一维数组
然后读出来
请问还有没有什么更加方便快速的方法访问指定位置的数据?多谢各位高手了!!!

解决方案 »

  1.   

    用MemoryStream.Seek(...)或MemoryStream.Position指定当前流的位置,然后需要度多少个字节自己控制,没必要定义一个很大的数组Buffer的类型可以为任何类型
      

  2.   

    我刚刚试了下,从单帧处理的时间来看好象和我的那种方法差不多。用这种方法,如果想读取大量数据 就会频繁调用Read(var Buffer; Count: Longint),不会影响速度吗?SEEK和POSITION哪个更快一些呢?
      

  3.   

    Position的内部处理就是调用了Seek方法,精确的说会比Seek慢些这种方法应该比定义一个巨大的数组要慢些,定义巨大的数组是用多的内存换取速度,而频繁的调用Read则是用速度的损失来节省内存,这就看具体的需求了
      

  4.   

    我又试了下连续采集100帧的用时,频繁调用Read(var Buffer; Count: Longint)好象是要更费时一些,大概慢了百分之三十。我对速度的要求要高一些。 Buffer可以用任何类型,那为什么我用变长数组会报错呢?procedure TForm1.Button1Click(Sender: TObject);
    type  tBuffer= Array of byte;
    var
      RectBmp:TBitmap;
      c:TBitmap;
      S: TMemoryStream;
      b:tbuffer;
      v:string;
      i:integer;
    begin
      RectBmp:=TBitMap.Create;
      c:=tbitmap.Create ;
      s:=TMemoryStream.Create ;
      v:='';
      setlength(b,304182);
      RectBmp.Assign(Image1.Picture.Bitmap);
      rectbmp.SaveToStream (s);
      s.Position :=54;
      s.Read(b,304182);  for i:=0 to 304182 do
      begin
        v:=v+inttostr(b[i])+'  ';     //会在这句报内存出错  end;
      edit1.Text:= v ;
      s.Free ;end;
      

  5.   

    setlength(b,304182);
      RectBmp.Assign(Image1.Picture.Bitmap);
      rectbmp.SaveToStream (s);
      s.Position :=54;
      s.Read(b,304182); //修改为s.Read(b[0], 304182); 即可取消下面的内存出错  for i:=0 to 304181 do     ////////////304182数组越界,但一般不会造成内存出错,
      begin
        v:=v+inttostr(b[i])+'  ';     //会在这句报内存出错  end;