2012-10-03 140 views
2

我有下一個JPEG圖像解壓縮標準代碼,它基於libjpeglibjpeg:解壓縮和剪裁

jpeg_decompress_struct cinfo; 
// ...Set error manager and data source... 
jpeg_read_header(&cinfo, TRUE); 
jpeg_start_decompress(&cinfo); 
while (cinfo.output_scanline < cinfo.output_height) { 
    JSAMPLE* scanlines[1]; 
    // ...Set target pointer for scanline... 
    jpeg_read_scanlines(&cinfo, scanlines, 1); 
} 
jpeg_destroy_decompress(&cinfo); 

我想讀的圖像的一部分,由矩形裁剪:

// struct RECT { 
//  int left; 
//  int top; 
//  int right; 
//  int bottom; 
// }; 
RECT cropRect; // Coordinates of the crop rectangle relative to the output image size 

我應該在代碼修改下面告訴libjpeg立即裁剪圖像?

這是我怎麼能實現它:

  1. 忽略第一top - 1線;
  2. 對於接下來的bottom - top行中的每一行: 1)將掃描行讀取到臨時緩衝區; 2)將列範圍[left, right)中的像素從臨時緩衝區複製到目標緩衝區。
  3. 中止解壓縮。

但是這段代碼是多餘的。

+0

這是多餘的,但很簡單。除非你真的需要更好的東西,否則我會堅持下去。 –

回答

2

性能方面,尤其是如果原始圖像是高分辨率,而您只需要相對較小的一部分,您應該首先使用可能爲16x16像素(8x8?)粒度和速度的crop/trim the image losslessly without decompressing it,然後解壓縮跳過只有幾行和像素不在邊緣。您也可能喜歡這種方法,以獲取操作中使用的較小內存量。

如果你裁剪了一下,那麼最初開始解壓縮的計劃可能是最好的。這裏幾乎沒有冗餘。

+1

通常16x16是你能做的最好的。 8x8僅當圖像在色度中不進行二次採樣編碼時纔可能。 –

+0

感謝您的回答,@Roman R.現在我將使用現有代碼,但是如何在'libjpeg'中做無損裁剪是很有趣的。在當前情況下,我需要超過50%的圖像寬度和50%的圖像高度,並且代碼將在Android OS上運行。如您所知,嵌入式系統的內存不多。 –

+0

@ artyom.stv,由於libjpeg一次只讀取一行,因此讀取完整圖像大小的內存開銷可以忽略不計。當圖像被讀取時,您將立即丟棄字幕周圍的字節。 –