簡體   English   中英

libjpeg解碼為BGR

[英]libjpeg decoding to BGR

我正在使用libjpeg將jpeg映像從磁盤解碼到堆上分配的內存緩沖區。 我使用jpeg_read_scanlines從文件中讀取和解碼每個掃描線。 這完美地工作,將每個像素解碼為24位RGB值。

問題是我正在使用一個額外的第三方庫,它需要一個BGR格式的緩沖區(而不是RGB)。 當使用這個庫時,我得到奇怪的結果,因為通道的順序錯誤。

因此,我想找到一種方法使libjpeg解碼為BGR格式而不是RGB。 我已經在網上搜索過,無法找到如何配置libjpeg來做到這一點? 我知道我可以通過內存緩沖區進行額外的傳遞並手動重新排序顏色通道,但是我正在處理的應用程序非常關鍵,必須盡可能快速有效。

幾種解決方案:

  • 按照建議進行轉換。 如果您處理4個像素的組,您可以使用三個32位讀寫,位掩碼和移位來完成所有操作,並且速度非常快。
  • 將libjpeg的YUV修改為RGB轉換或剛剛修改后的階段,以便交換R和B.
  • 使用libjpeg-turbo 它向后兼容libjpeg,具有SIMD加速,並提供JCS_EXT_BGRJCS_EXT_BGRX顏色空間。
  • 修改源圖像,以便交換它們的R和B通道。 聽起來很傻,但它需要零源代碼修改。

另外,你說你在追趕速度但你操縱BGR數據(而不是BGRX)。 這對我來說沒有多大意義,因為在32位邊界上對齊像素可能要快得多。

正如Antun Tun所說,配置在jmorecfg.h 在我的libjpeg(v7)版本中,它位於第320行:

#define RGB_RED     0   /* Offset of Red in an RGB scanline element */
#define RGB_GREEN   1   /* Offset of Green */
#define RGB_BLUE    2   /* Offset of Blue */

所以你只需將它們改為:

#define RGB_RED     2   /* Offset of Red in an RGB scanline element */
#define RGB_GREEN   1   /* Offset of Green */
#define RGB_BLUE    0   /* Offset of Blue */

而且你已經完成了。 評論進一步說:

/*
 * RESTRICTIONS:
 * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
 * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
 *    useful if you are using JPEG color spaces other than YCbCr or grayscale.
 * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
 *    is not 3 (they don't understand about dummy color components!).  So you
 *    can't use color quantization if you change that value.
 */

JPEGLIB說你必須修改jmorecfg.h才能改變通常的RGB值順序。 以下是文檔鏈接: http//www.opensource.apple.com/source/tcl/tcl-20/tcl_ext/tkimg/tkimg/libjpeg/libjpeg.doc它位於數據格式部分

由於libjpeg的最后版本,還可以修改out_color_space的屬性cinfo后獲得的對象jpeg_read_header()調用。

引用libjpeg.txt

J_COLOR_SPACE out_color_space

輸出顏色空間。 jpeg_read_header()根據jpeg_color_space設置適當的默認值; 通常它將是RGB或灰度。 應用程序可以更改此字段以請求不同顏色空間中的輸出。 例如,將其設置為JCS_GRAYSCALE以從顏色文件中獲取灰度輸出。

因此,如果您希望將圖像解碼為BGR,則可以在解壓縮時添加此行:

cinfo.out_color_space = JCS_EXT_BGR;

看看我的JPEG編解碼器。

我實際上沒有測試它對libjpeg的速度。 如果你能做到這一點,那可能就是一個啟示。 無論如何,解碼器都在一個文件中,簡單地顛倒通道的順序將非常簡單。

我在這里維護JPEG代碼:

https://github.com/MalcolmMcLean/babyxrc/tree/master/src

據我所知,Libjpeg無法做到這一點。
無論如何,它只是一個O(n)變換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM