1. 程式人生 > >delphi -- GDi+ Delphi如何讓 TGPImage 直接從流中載入圖片

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;

相關推薦

delphi -- GDi+ Delphi如何 TGPImage 直接載入圖片

方法一: Delphi 的 TBitmap 類可以方便地操作流, 如果能讓 TGPImage 和 TBitmap 溝通起來就好了; TGPImage 有一個子類 TGPBitmap 可以和 TBitmap 溝通... ok 了! 程式碼如下: uses GDIPOBJ, GDIPAPI; procedure

Opengl如何磁碟載入圖片生成紋理物件

IplImage* imgBGR = cvLoadImage(szPathName); IplImage* imgRGB = cvCreateImage(cvGetSize(imgBGR), 8, 3); cvCvtColor(imgBGR,imgRGB,CV_BGR2RG

關於在struts2利用jquery如何動態資料庫載入圖片並顯示

本來我一開始總是在想,我該如何利用jquery的$ajax()方法來動態獲得圖片然後在改變現有img標籤圖片的內容呢? 查了好久,但一直沒發現滿意的,突然我從最基本的獲得圖片得到靈感。 首先,我是直接把圖片以blob型別存到資料庫中的,利用hibernate配置好的。 只

Win32資源載入PNG圖片,然後建立GDI+的Image物件

void LoadPNGFromStaticRes(HMODULE hModule, UINT nResId, Image** ppImg) { HRSRC hRes = FindResource(hModule, MAKEINTRESOURCE(nResId), TEXT("PNG"))

dispatch 直接props拿不到的原因是connect做了操作 已經和dispatch綁定了 所以不會再返回dispatch了

> mapDispatchToProps如果是物件,那麼會和store繫結作為props的一部分傳入ui元件。如果是個函式,它接受兩個引數,bindActionCreators會將action和dispatch繫結並返回一個物件,這個物件會和ownProps一起作為props的一部分傳入ui元

瀏覽器 WebBrowser 直接記憶體資料顯示圖片而不是連結一個外部檔案

如何讓網頁裡面的圖片,直接從記憶體資料載入,而不是一個圖片檔案的連結 查了一些資料,基本概念如下: 2. Data URI scheme 包括: data:,文字資料 data:text/plain,文字資料 data:text/html,HTML程式碼 data:t

資源載入jpg, png到GDI+ Image

從資源中載入jpg和png檔案, 貌似不應該是個大問題, 一google結果一大堆, 卻有兩個陷阱,trap啊1, 是Bitmap(RT_BITMAP)型別的圖片無法載入, RT_BITMAP是預定義型別, 資源裡面沒有bmp檔案的頭, SizeofResource 的返

不通過註解,直接request讀取POST請求體資料

在開發基於SpringBoot框架的web工程時,我們一般通過@RequestBody註解,把post請求體中的資料自動封裝到實體類中。但是,有時候,post請求體中的資料並不適合轉化成實體類,根據場景

在VC使用GDI+自定義資源載入圖片

函式定義: BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Image * & pImg) { HINSTANCE hInst = AfxGetResourceHandle(); HRSRC hRsrc = ::Find

將字串讀入,字串的轉換

字串從流中讀入使用起來非常方便,特別是在高精度演算法當中,不過效率不可觀,應當酌情使用,下面介紹兩種方法 C++語言 stringstream 標頭檔案:#include<sstream>

Java 讀取byte的奇怪現象,出現負值,詳解

其實一點都不奇怪,下面我們來詳細分析 首先看下面一段程式碼,程式碼的意思是將128寫入到檔案中,再從檔案中讀出一個byte輸出 File f = new File("f1"); FileOutputStream fos = new F

Django PIL 直接記憶體或資料庫blob顯示圖片

最近想實現一個圖片驗證的Python程式碼,被PIL卡住了。因為看了PIL的一些demo,就是沒有看到直接將image轉換成記憶體資料或可以直接print資料的,總不成我要將image先存成臨時檔案吧?這我可接受不了,我試了好長時間終於在limodou那裡的一篇文章找到了靈感

直接chrome復制的body到postman希望能自動識別去除空格

rep 自動識別 postman expec rod ima quest rom body Describe the bug直接從chrome開發者工具中request的body復制到postman中時會帶有空格,需要手動刪除空格。 To Reproduce1、使用chr

nodeks —— fs模塊 —— 讀取和寫入數據

require dstream ali 壓縮文件 當前目錄 con style 代碼 zlib Fs流讀取和寫入數據 使用文件流來讀取大文件不會卡頓 1, 從流中讀取數據 var fs = require("fs"); var data = ‘‘; var cou

的三種求和方式談起

//使用reduce()方法 int reduce = Arrays.asList(ins).stream().reduce(0,

啟動伺服器時將配置引數資料庫載入到快取

最近做專案,碰到這樣的需求:在伺服器啟動的時候從資料庫讀取引數,將引數儲存到記憶體快取中 由於使用的是spring的自動注入方式,一開始用@component註解在啟動的時候載入查詢配置引數的bean,由於bean中要用到其他bean來查詢,但此時都為null 查詢相關資料,發現@PostC

ionic拍照上傳圖片檔案選擇圖片

本文主要使用cordova實現拍照上傳,拍照上傳或從資料夾中選擇上傳圖片 流程:拍照或選擇圖片===>獲取本機路徑==>向伺服器上傳圖片,獲取伺服器上圖片路徑 一、環境準備   安裝 cordova-plugin-camera 外掛     &n

Springboot 類不能使用@Value註解yml載入

對於下面的類,使用了@Value,但是不能從yml中讀取值,怎麼辦? 帶有@Value標籤類: package com.itmuch.cloud; import org.springframework.beans.factory.annotation.Value; import org

springboot配置addResourceHandler和addResourceLocations,使得可以磁碟讀取圖片、視訊、音訊等

磁碟目錄 WebMvcConfig的程式碼 //對靜態資源的配置 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { String os = System.ge

OllyDbg IDA pro強強聯合 OllyDbg載入IDA Pro輸出的map資訊檔案,帶符號資訊除錯

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!