使用GDAL產生快視圖主要有兩個步驟,第一重採樣生產小映像;第二將產生的小映像CreateCopy產生jpg格式或者png格式。由於GDAL不支援直接建立Jpg或者png的壓縮格式的映像,所以中間需要一個中轉的過程。
下面簡單說明一下過程,代碼就不貼了。首先通過擷取採樣比例計算輸出映像的大小,這裡可能需要根據需求自己定義。我遇到了一般有兩種情況:第一種,將映像直接縮小到原來的10分之一(或者其他的比例),比如原圖是20000×20000,那麼快視圖就是2000×2000。第二種,輸出的映像範圍在一個指定的範圍,比如輸出的快視圖大小不能超過1024×1024,那麼這裡就需要通過原始映像的寬度和高度和這個1024計算採樣比例。對於這兩種情況,最後都是歸結到一種情況來處理,那就是計算重採樣比例,然後使用重採樣比例進行採樣。
關於使用GDAL重採樣的部分代碼可以參考之前的部落格《如何使用GDAL重採樣映像》,地址是:http://blog.csdn.net/liminlu0314/article/details/6130064。
使用重採樣生產一個臨時檔案,這個檔案是一個GDAL可以直接建立的映像,比如Tiff格式,或者img格式。接下來使用GDALOpen開啟這個映像,然後使用CreateCopy函數建立一個jpg映像(png與之類似),最後把這個tiff臨時檔案刪除即可。到這裡的話,這個功能就算完成了,但是總覺得有點不爽的感腳。是啥呢,就是這個臨時檔案,就這麼個小功能,來個臨時檔案,確實感覺不爽啊,下面就告訴大家怎麼替換這個臨時檔案。
如果有人看過我的部落格,應該會記得之前有篇部落格,關於GDAL的記憶體檔案,就是MEM格式的檔案。部落格叫《使用GDAL的MEM記憶體檔案儲存臨時檔案》,地址為:http://blog.csdn.net/liminlu0314/article/details/7166230。好了,就是他,我們可以使用MEM來替代這個臨時檔案。
關於MEM記憶體檔案的使用,和普通的映像一樣,只不過在建立的時候,驅動選擇MEM,建立映像的時候不需要指定檔案路徑,直接用Null 字元串即可。
通過上面的分析,這裡大致總結一下,修改GDAL重採樣的代碼,把裡面的建立輸出的映像建立為一個MEM的GDALDataset,這樣重採樣後的結果就儲存在這個MEM的GDALDataset中了;接下來再建立一個JPG的驅動,使用JPG的驅動的CreateCopy函數來產生jpg映像就可以了。
PS:MEM檔案的大小依賴於自己的電腦的記憶體,所以在建立MEM檔案的時候確保自己的電腦記憶體能夠存的下這個檔案,如果太大就會失敗,鑒於這裡的快視圖一般都比較小,此處使用MEM還是蠻合適的。