GDAL直接操縱記憶體中的影像資料的辦法

2021-08-23 13:45:18 字數 2112 閱讀 3225

沒有乙個簡單現成的函式可以做到這個,frank warmerdam提示了一種辦法,使用「記憶體檔案系統」,但不是通常linux下的那種記憶體檔案系統,而是gdal自定義的。

首先需要安裝乙個記憶體檔案處理器

這個特殊的檔案處理器可以將一段記憶體塊作為檔案處理,這些檔案位於"/vsimem/" 目錄下(不用找了,在shell下是看不到的),也就是說該目錄下的所有檔案都被gdal的記憶體檔案處理器處理。不過目前還不支援目錄操作,所以vsimem目錄是平的。另外不同的程序有各自的/vsimem/目錄,而同一程序下的所有執行緒共享同一/vsimem/目錄。

可以用那些vsi*l函式建立和銷毀記憶體裡的資料,就像是操作檔案一樣。還有些方法可以高效的建立記憶體檔案:不必拷貝原始的資料,這樣同樣的資料就不會重複出現在多個地方了;可以將某段記憶體塊關聯成「gdal記憶體檔案系統"中的乙個檔案。

[size=large]a. 將記憶體中的一塊二進位制影像資料buffer讀入到gdaldataset[/size]

然後對gdaldataset進行各種gdal操作。乙個例子如下:

1. 影像二進位制資料在記憶體中的位置為pabyindata,資料的長度為nindatalength,我們為它建立乙個記憶體影像檔案work.dat

vsifclosel( vsifilefrommembuffer( "/vsimem/work.dat", pabyindata,

nindatalength, false ) );

2. 開啟這個記憶體影像檔案,得到乙個gdaldataset

gdaldataseth hds = gdalopen( "/vsimem/work.dat", ga_readonly );

用完後記得要呼叫下列函式刪除記憶體中的這個檔案:

vsiunlink( "/vsimem/work.dat" );

[size=large]b.將gdaldataset轉換成某種格式的二進位制影像資料流。[/size]

舉乙個gtiff例子,hds為想輸出為二進位制資料的gdaldataset

1. 轉換成目標資料格式的gdaldataset,這個gdaldataset是建立在「記憶體影像檔案系統」上的

gdaldriverh hdriver = gdalgetdriverbyname( "gtiff" );

gdaldataseth houtds= gdalcreatecopy( hdriver, "/vsimem/out.tif", hds, true, null,

null, null );

houtds是乙個指向記憶體影像檔案系統上的指標,不用自己關閉。

2. 呼叫vsigetmemfilebuffer函式從記憶體影像檔案中讀出二進位制資料流

vsi_l_offset outdatalength;  // 讀出的二進位制資料流的長度放在這個變數裡

int bunlinkandseize = true;

gbyte * bindata = vsigetmemfilebuffer("/vsimem/out.tif", &outdatalength, bunlinkandseize);

bindata為轉換後的gtif格式的二進位制影像資料,outdatalength為該影像資料的長度

bunlinkandseize為true的意思是,記憶體影像檔案將會被自動刪除,所以不必再呼叫vsiunlink("/vsimem/out.tif")刪除記憶體影像檔案了(houtds也不用自己關閉);如果為false,則會保留記憶體影像檔案(houtds也要自己關閉)。

vsigetmemfilebuffer函式分配的記憶體不要再用cplfree函式釋放:

cplfree(bindata);

否則可能出現double free錯誤,然後core dump。

vsi*函式內部會呼叫安裝函式vsiinstallmemfilehandler();這個安裝函式一般不需要直接呼叫,反覆呼叫這個安裝函式也沒什麼害處。

雖然還是原來的檔案操作,但實際上是對記憶體直接操作的,只不過披上檔案的外衣而已。

參考鏈結點[url=這裡:vsiinstallmemfilehandler[/url]。

SQL擴充套件之T SQL中的資料操縱語言

資料操縱語言在dml包括向表中插入記錄,修改記錄,刪除記錄的語句 1,插入語句 inset 語句用於向資料表或者檢視中插入由values 指定的各列值的行,其語法格式如下 insert top expression percent into n n 指定列值的value子句 derived tabl...

記憶體中的資料對齊

為何要位元組對齊 簡單來說就是提高cpu對記憶體的訪問效率。為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 然而,對齊的記憶體訪問僅需要一次訪問。比如有些平台每次讀都是從偶位址開始,如果乙個int型 假設為32位系統 存放在偶位址開始的地方 那麼讀乙個週期就可以讀出這32bit,而如果存放在奇位...

把DBGRID資料直接匯入EXCEL中的過程

忙了一天就忙了個excel匯出,以為很好了,雖然慢點,沒想到臨了還真整出乙個更好的匯入方法。可喜可賀。只可惜一天就這麼點收穫啊。大家看看把。直接從excel表顯示資料。要uses comobj private procedure copydbdatatoexcel target tdbgrid 定義...