[英]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.