2012-04-20 79 views
0

任何人都可以告訴我如何在C++中以8 x 8塊的形式分割JPEG圖像。在C++中以塊分割jpeg圖像

謝謝。

+0

你已經在內存中的圖像,並準備對它執行DCT? – GManNickG 2012-04-20 18:26:06

+0

是的。 – NiVeR 2012-04-20 18:28:43

+0

我還有點不清楚。你的意思是你有內存中的壓縮數據嗎?如果是這樣,你會想要執行* inverse * DCT來恢復空間數據。在這種情況下,它已經被分成了8x8塊。如果你在內存中有「原始」像素,並且想要進行JPEG壓縮,那麼你會將它分解爲8x8塊,然後在每個塊上進行DCT。 – 2012-04-20 18:43:53

回答

1

你必須解壓縮圖像,使用turbojpg庫(速度非常快),它會給你一組unsigned char作爲RGB(或RGBA)。現在你有一個未壓縮的圖像,它分別具有R G和B的字節值。

你可以從這裏開始做一個簡單的循環,它將通過3 * 8 char塊並使用memcpy複製它們到其他一些內存位置。

您必須記住,從turbojpg庫返回的數組是一維字節的線性數組。所以掃描線一個接一個地存儲。在創建塊時考慮到這一點,根據您的需要而定,您必須以不同的方式遍歷數組。

+0

我想不使用任何外部庫。 – NiVeR 2012-04-20 18:22:39

+0

所以你想自己編寫JPEG解壓縮函數嗎?朋友,從經驗中,我可以告訴你,如果你想要任何體面的速度,這並不容易! – 2012-04-20 18:24:04

+0

首先,我想打開圖像並以8×8像素塊表示,但唯一的辦法是我可以想到複雜度爲O(w * h)其中w和h是圖片的重量和高度,這當然太慢了。 – NiVeR 2012-04-20 18:27:12

2

嗯,這個頑固的方法。我的心向你傾訴。預計會學到很多東西,但要預先警告你會失去時間,血液和痛苦。

Compression FAQ有關於JPEG如何工作的一些細節。一個好的起點是第2部分:主題75:JPEG簡介。

概括地說,對於一個典型的JPEG文件,你將不得不逆轉編碼步驟6至4:

  1. (6)提取從JFIF容器
  2. 適當的報頭和圖像數據( 5)逆轉Huffman編碼
  3. (4)反向量化

,那麼你應該留下8×8塊,你可以喂到合適的逆DCT。

維基百科有關於JFIF格式以及JFIF中的霍夫曼表和structure of the JPEG數據的一些細節。

我假設你正在尋找使用JPEG來了解它?因爲如果你有一些實際的應用,訪問原始編碼塊幾乎肯定不是必需的。

在看到評論後編輯:如果您只是想在不讀取/解壓縮整個文件的情況下獲得非常大的JPEG的一部分,則可以使用ImageMagick的stream命令。它允許你在不讀取整個文件的情況下獲取子圖像。使用像例如從(16,16)開始獲得一個8x8塊。

+0

我對學習和開發感興趣面向未來的人臉識別軟件。但現在我想學習基礎知識。 – NiVeR 2012-04-20 19:32:11