[英]libjpeg decoding to BGR
我正在使用libjpeg將jpeg映像從磁盤解碼到堆上分配的內存緩沖區。 我使用jpeg_read_scanlines
從文件中讀取和解碼每個掃描線。 這完美地工作,將每個像素解碼為24位RGB值。
問題是我正在使用一個額外的第三方庫,它需要一個BGR格式的緩沖區(而不是RGB)。 當使用這個庫時,我得到奇怪的結果,因為通道的順序錯誤。
因此,我想找到一種方法使libjpeg解碼為BGR格式而不是RGB。 我已經在網上搜索過,無法找到如何配置libjpeg來做到這一點? 我知道我可以通過內存緩沖區進行額外的傳遞並手動重新排序顏色通道,但是我正在處理的應用程序非常關鍵,必須盡可能快速有效。
幾種解決方案:
JCS_EXT_BGR
和JCS_EXT_BGRX
顏色空間。 另外,你說你在追趕速度但你操縱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代碼:
據我所知,Libjpeg無法做到這一點。
無論如何,它只是一個O(n)變換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.