2010-09-09 52 views
3

如果可能,使用libjpeg我想從JPEG圖像的中間讀取一行而不讀取所有前面的行。這可以做到嗎?我可以使用libjpeg讀取特定的圖像行嗎?

+0

如果你的意思是直接從文件中,沒辦法。 JPEG格式被嚴格壓縮,所以你不能在不需要解壓縮整個文件的情況下拉出一行。 – 2010-09-09 21:41:27

+0

我擔心可能會出現這種情況,儘管我曾希望JPEG壓縮可能偶爾會重置,從而允許無序的讀取。看看libpng,它似乎也只允許順序訪問。那麼,我假設PNG也不能被隨機讀取? – 2010-09-09 22:45:21

+0

PNG可能更適合隨機訪問,但前提是其無損壓縮模式未使用。大多數圖像處理庫都將文件I/O作爲一種填充和存儲幀緩衝區的方式,並且所有實際處理都是在包含整個圖像的未壓縮緩衝區的RAM中完成的。魔鬼詳細介紹瞭如何組織緩衝區。 – RBerteig 2010-09-10 01:02:13

回答

2

答案几乎肯定是「你可以,但需要比你想要的更多的努力」。

JPEG圖像是一種標記流,它包含整個壓縮圖像的全局信息或與圖像特定部分相關的信息。壓縮通過將圖像分解成色彩平面來工作,可能將色彩空間改變爲可對色彩信息進行降採樣的色彩空間,並在每個以8x8像素塊爲單位的平面內進行。

例如,如果通過僅轉置基本塊和每個塊內部的係數來確定壓縮圖像的大小使其僅由整個塊構成,則可以將壓縮圖像旋轉90度;即不需要解壓縮,旋轉真實圖像並重新壓縮。

鑑於此,您的方法是在進入庫的過程中解析標記流,將所有標記全局傳遞給圖像,修改與圖像大小相關的任何標記,並刪除包含係數的標記裁剪矩形。

如果限制種植完成基本塊太粗糙,您可能需要進一步裁剪結果。

我不清楚的是,是否有真正的勝利替代方案,即從圖書館出來的結果。該庫具有高度可配置性,因此您可以提供未壓縮的數據使用者功能,該功能會丟棄裁剪矩形之外的所有像素,並只保存想要保留的像素。

+0

感謝您的詳細評論。我認爲你是對的,與簡單地處理libjpeg的輸出相比,它沒有什麼優勢。我最初的想法是將圖像保存在磁盤上,然後加載和繪製特定的圖塊。最後,我認爲更好的方法是簡單地一次處理源文件一行,在磁盤上生成緩存切片,然後根據需要加載這些切片。 – 2010-09-11 02:35:34

+0

@Michael Cooper,這對我很有意義。您可以使用多分辨率金字塔,並按需填充切片,並將其緩存回磁盤。我相信這實質上就是Adobe Light Room在其縮略圖緩存中所做的,例如,每個分辨率都放在一個單獨的文件中。 – RBerteig 2010-09-11 03:21:16

相關問題