Var
  StrQ:String;
  TmpChar:Char;
  Stream1:TFileStream;
  I,MemSize:Integer;
begin
  strQ := 'E:\inetpub\picmanage\files\2.jpg';
  stream1:=TFileStream.Create(strQ, fmOpenRead);
  Stream1.Seek(0,soFromBeginning);
  MemSize := stream1.Size;
  SetLength(StrQ,MemSize);I:=0;
  While Stream1.Position<Stream1.Size Do
    Begin
      Inc(I);
      Stream1.Read(TmpChar,1);
      StrQ[I]:=TmpChar;
    End;
  ShowMessage(IntTOSTr(MemSize)+'     '+IntToSTr(I));
end;

解决方案 »

  1.   


      strQ := 'E:\inetpub\picmanage\files\2.jpg';
      stream1 := TFileStream.Create(strQ, fmOpenRead,fmShareDenyNone);
      MemSize := stream1.Size;
      inc(MemSize);
      Stream1.Read(strQ,MemSize-1);   //×××××××××
      

  2.   

    to airhorse:
      Pascal的字符串结构是不能这样读的:)
      

  3.   

    这样当然不行了,还是看我的代码吧·{$R *.DFM}
    function ComponentToString(Component: TComponent): string;
    var
      BinStream         : TMemoryStream;
      StrStream         : TStringStream;
      s                 : string;
    begin
      BinStream := TMemoryStream.Create;
      try
        StrStream := TStringStream.Create(s);
        try
          BinStream.WriteComponent(Component);
          BinStream.Seek(0, soFromBeginning);
          ObjectBinaryToText(BinStream, StrStream);
          StrStream.Seek(0, soFromBeginning);
          Result := StrStream.DataString
        finally
          StrStream.Free
        end
      finally
        BinStream.Free
      end
    end;function StringToComponent(Value: string): TComponent;
    var
      StrStream         : TStringStream;
      BinStream         : TMemoryStream;
    begin
      StrStream := TStringStream.Create(Value);
      try
        BinStream := TMemoryStream.Create;
        try
          ObjectTextToBinary(StrStream, BinStream);
          BinStream.Seek(0, soFromBeginning);
          Result := BinStream.ReadComponent(nil)
        finally
          BinStream.Free
        end
      finally
        StrStream.Free
      end
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      img : TImage;
      s:string;
    begin
      img := TImage.Create(nil);
      img.Picture.LoadFromFile('d:\1.bmp');
      s:=ComponentToString(img);
      memo1.Text :=s;
      img.Free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      img : TImage;
    begin
      try
        img := TImage(StringToComponent(Memo1.Text));
        Image1.Picture.Assign(img.Picture );  finally // wrap up
        if img<>nil then img.Free;
      end;    // try/finally
    end;
    initialization
      RegisterClass(TImage);
    end.
      

  4.   

    airhorse(编程至尊宝) 只差一点了,
    这样:  strQ := 'E:\inetpub\picmanage\files\2.jpg';
      stream1 := TFileStream.Create(strQ, fmOpenRead,fmShareDenyNone);
      MemSize := stream1.Size;
      SetLength(strQ,MemSize);
      Stream1.Read(strQ[1],MemSize);  //×××××××××
      

  5.   

    Fairton(飞云) :
      你的代码我这样改了一下,成了, 可惜输出的图形还是能够被浏览器保存。为什么这么说呢?
    因为我以前做 ASP 上传组件的时候,把上传的图形直接再输回浏览器时,浏览器能正常显示,但保存后,图片大小只有不到20字节,嘿嘿,可以保护图片不被客户端COPY(抓屏除外),这次为什么不行了呢?
    begin
      strQ := 'E:\inetpub\picmanage\files\2.jpg';
      stream1:=TFileStream.Create(strQ, fmOpenRead);
      Stream1.Seek(0,soFromBeginning);
      MemSize := stream1.Size;
      SetLength(StrQ,MemSize);I:=1;
      While I<=MemSize Do
        Begin
          Stream1.Read(TmpChar,1);
          StrQ[I]:=TmpChar;
          Inc(I);
        End;
        Response.ContentType := 'image/*';
        Response.Content := StrQ;
    end;
    airhorse(编程至尊宝) :你觉得guig(胖胖)改的可以吗?:
      strQ := 'E:\inetpub\picmanage\files\2.jpg';
      stream1 := TFileStream.Create(strQ, fmOpenRead,fmShareDenyNone);
      MemSize := stream1.Size;
      SetLength(strQ,MemSize);
      Stream1.Read(strQ[1],MemSize);  //×××××××××
                       ~~~
                       始终是 [1] 吗?CaiDaoLi() :你的代码也许将来会有用,我已收起来了,谢谢!