2011-01-30 45 views
5

我一直在研究有關遙感圖像處理和圖像序列循環的項目。每個生成的圖像(JPEG或PNG格式)都有大約8000 * 4000像素。我們的用戶通常希望一次根據感興趣的區域循環圖像序列(超過50張圖像)。因此,我必須根據用戶的可視化客戶端大小從每個圖像中提取所需的查看區域。例如,如果用戶的當前客戶端視圖是640 * 480,則必須根據當前的x(列)和y(行)座標從每個原始圖像中找到640 * 480數據塊的大小,然後重新映射到客戶端視圖。當用戶通過鼠標拖動到另一個查看區域時,我們的程序必須相應地儘快將區域數據從每個原始圖像中重新加載。大型JPEG/PNG圖像序列循環

我既不知道JPEG庫也不知道PNG庫有一些內置的數據塊讀取例程,如 long ReadRectangle(long x0,long y0,long x1,long y1,char * RectData); long ReadInaRectangle(long x0,long y0,short width,short height,char * RectData);

內置的JPEG解壓縮器沒有這種功能。我知道JPEG2000格式有用於解壓縮圖像的特定區域的規定。我對JEPG並不完全確定。

有人建議我使用CreateFileMapping,MapViewOfFile和CreateDIBSection來提交映射到視圖的文件映射的字節數。與簡單的平面二進制圖像格式(如* .raw,*。img和* .bmp)不同,JPEG的Blob不僅包含圖像數據,還包含複雜的JPG標頭。所以將一個數據塊視圖映射出JPEG文件並不容易。

有人建議我使用圖像拼貼或圖像金字塔技術來生成子圖像,就像流行的mnay,圖像可視化(Google Earth等)和GIS應用程序(WebGIS等)一樣。

我該如何解決這個問題?

感謝您的幫助。

Golden Lee

回答

0

這對gd library很簡單。 LibGD是由程序員動態創建圖像的開源代碼庫。

+0

儘管此鏈接可能會回答問題,但最好在此處包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Stewbob 2012-08-16 14:53:30

+0

@Stewbob:答案不在鏈接後面。答案是「使用gd庫很容易」,它包含一個指向gb庫的鏈接。恕我直言,這是好的。 – 2012-08-17 10:50:06

3

如果您確定區域座標爲8的倍數,則ijg的JPEG庫可以幫助您加載部分JPEG圖像。

你會想:

  1. 獲取整個圖像的所有DCT係數。這是一個example of how to do this。是的,這將涉及整個圖像的熵解碼,但是這是JPEG解碼的較不昂貴的步驟(IDCT是最昂貴的一步,我們正在避免它)。
  2. 丟棄您不需要的塊(每個塊包含8x8)係數。你必須手工完成,但由於佈局非常簡單(塊以掃描線順序),它不應該那麼難。
  3. 對每個幀應用塊反DCT。你可能可以讓IJG爲你做。如果你不能,那麼你必須做你自己的IDCT,並且顏色變換回到[0,255],因爲在JPEG世界中強度在[-127,128]。
  4. 如果一切順利,你會得到你的解碼JPEG圖像。由於chroma subsampling,亮度和色度通道可能具有不同的尺寸,您將不得不通過縮放來補償這一點。

前兩個步驟幾乎涵蓋了鏈接。第四種方法非常簡單(可以使用IJG接口獲得色度子採樣的類型,而使用類似OpenCV或滾動自己的代碼就可輕鬆實現縮放 - 本質上是採樣)。 第三一個是我還沒有嘗試過,但它聽起來像是可能的。