delphi -- GDi+ Delphi如何讓 TGPImage 直接從流中載入圖片
Delphi 的 TBitmap 類可以方便地操作流, 如果能讓 TGPImage 和 TBitmap 溝通起來就好了;
TGPImage 有一個子類 TGPBitmap 可以和 TBitmap 溝通... ok 了!
程式碼如下:
uses GDIPOBJ, GDIPAPI;
procedure TForm1.FormPaint(Sender: TObject);
const
ImgPath = 'c:\temp\test.bmp';
var
img: TGPImage;
bit: TBitmap;
g: TGPGraphics;
begin
bit := TBitmap.Create;
bit.LoadFromFile(ImgPath); {因為 TBitmap 操作流特別方便, 這裡就沒有演示}
img := TGPBitmap.Create(bit.Handle, bit.Palette);
g := TGPGraphics.Create(Canvas.Handle);
g.DrawImage(img, 0, 0);
g.Free;
bit.Free;
img.Free;
end;
方法二:
TGPImage 需要的是 IStream 而非 TStream, 直接給它一個 IStream 引數不就完了?
那怎麼實現 IStream 介面呢? Classes 單元下有一個 TStreamAdapter 類就是專門實現 IStream 介面的.
uses GDIPOBJ, GDIPAPI;
procedure TForm1.FormPaint(Sender: TObject);
const
ImgPath = 'c:\temp\test.bmp';
var
img: TGPImage;
MemStream: TMemoryStream;
MyIStream: TStreamAdapter;
g: TGPGraphics;
begin
MemStream := TMemoryStream.Create;
MemStream.LoadFromFile(ImgPath);
MyIStream := TStreamAdapter.Create(MemStream);
img := TGPImage.Create(MyIStream);
g := TGPGraphics.Create(Canvas.Handle);
g.DrawImage(img, 0, 0);
g.Free;
img.Free;
MemStream.Free;
MyIStream := nil; {注意這裡}
end;
注意 TStreamAdapter 的本質還是個介面, 只能 MyIStream := nil; 而不能 MyIStream.free;
如果這樣寫可能會容易理解一些, 不過要多 uses 一個 ActiveX 單元:
uses GDIPOBJ, GDIPAPI, ActiveX;
procedure TForm1.FormPaint(Sender: TObject);
const
ImgPath = 'c:\temp\test.bmp';
var
img: TGPImage;
MemStream: TMemoryStream;
MyIStream: IStream; {這裡和上面不同}
g: TGPGraphics;
begin
MemStream := TMemoryStream.Create;
MemStream.LoadFromFile(ImgPath);
MyIStream := TStreamAdapter.Create(MemStream);
img := TGPImage.Create(MyIStream);
g := TGPGraphics.Create(Canvas.Handle);
g.DrawImage(img, 0, 0);
g.Free;
img.Free;
MemStream.Free;
MyIStream := nil;
end;
TStreamAdapter.Create 方法還有一個 TStreamOwnership 型別的預設引數, 預設值是 soReference;
如果改為 soOwned, 那連 MyIStream := nil; 也不需要了; 因為和 MyIStream 關聯的物件會一同釋放它.
uses GDIPOBJ, GDIPAPI;
procedure TForm1.FormPaint(Sender: TObject);
const
ImgPath = 'c:\temp\test.bmp';
var
img: TGPImage;
MemStream: TMemoryStream;
MyIStream: TStreamAdapter;
g: TGPGraphics;
begin
MemStream := TMemoryStream.Create;
MemStream.LoadFromFile(ImgPath);
MyIStream := TStreamAdapter.Create(MemStream, soOwned);
img := TGPImage.Create(MyIStream);
g := TGPGraphics.Create(Canvas.Handle);
g.DrawImage(img, 0, 0);
g.Free;
img.Free;
MemStream.Free;
// MyIStream := nil; {此時如果有這句會出錯}
end;