繁体   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