2013-10-15 45 views
3

爲什麼我無法直接將MemoryStream分配給圖片? 下面我發佈了兩種分配MemoryStream給TImage的方法。 Method1不起作用,Method2起作用。爲什麼? 感謝 山姆分配JPEG錯誤#42

方法一:該方法返回一個錯誤JPEG#42

Var 
    ms1 : TMemoryStream; 
    J : TJPEGImage; 
    St : String; 
begin 
    ms1 := TMemoryStream.Create; 
    try 
     try 
     St := 'somepath'; 
     IdFTP1.Get(St, ms1); 
     if ms1.Size > 0 then 
     Begin 
      J := TJPEGImage.Create; 
      try 
      J.LoadFromStream(ms1); 
      Image4.Picture := nil; 
      Image4.Picture.Assign(J); // here, I got an error #42 JPEG 
      finally 
      J.Free; 
      end; 
     End; 
     except 
     on e:exception do ShowMessage(e.message); 
     end; 
    finally 
     ms1.Free; 
    End; 
    End; 
end; 

方法2:此方法

Var 
    ms1, ms2 : TMemoryStream; 
    J : TJPEGImage; 
    St : String; 
begin 
    ms1 := TMemoryStream.Create; 
    ms2 := TMemoryStream.Create; 
    try 
     try 
     IdFTP1.Get(somepath, ms1); 
     if ms1.Size > 0 then 
     Begin 
      J := TJPEGImage.Create; 
      try 
      J.LoadFromStream(ms1); 
      ms1.SaveToFile('lixofoto.jpg'); 
      ms2.LoadFromFile('lixofoto.jpg'); 
      J.LoadFromStream(ms2); 
      ImgProd.Picture.Assign(J); 
      DeleteFile('lixofoto.jpg'); 
      finally 
      J.Free; 
      end; 
     End; 
     except 

     end; 
    finally 
     ms1.Free; 
     ms2.Free; 
    End; 
+0

我敢肯定,這之前已經多次在這裏問。搜索該錯誤。 –

+0

@whosrdaddy:它的工作原理。非常感謝 – SammyBF

回答

10

IdFTP.Get呼叫後,您沒有重置內存流。這意味着LoadFromStream呼叫接收0字節,因此#42錯誤:

var 
    ms1 : TMemoryStream; 
    J : TJPEGImage; 
    St : String; 
begin 
    try 
    ms1 := TMemoryStream.Create; 
    try 
     St := 'somepath'; 
     IdFTP1.Get(St, ms1); 
     if ms1.Size > 0 then 
     begin 
     ms1.Position := 0; // <-- add this 
     J := TJPEGImage.Create; 
     try 
      J.LoadFromStream(ms1); 
      Image4.Picture.Graphic := J; 
     finally 
      J.Free; 
     end; 
     end; 
    finally 
     ms1.Free; 
    end; 
    except 
    on E: Exception do 
     ShowMessage(E.Message); 
    end; 
end;