10

我正在使用 libjpeg 将 jpeg 图像从磁盘解码到堆上分配的内存缓冲区。我jpeg_read_scanlines用来读取和解码文件中的每个扫描线。这是完美的,将每个像素解码为 24 位 RGB 值。

问题是我正在使用一个额外的第三方库,它需要 BGR 格式(而不是 RGB)的缓冲区。使用这个库时,由于通道的顺序错误,我得到了奇怪的结果。

因此,我想找到一种方法让 libjpeg 解码为 BGR 格式而不是 RGB。我已经浏览了网络,但找不到如何配置 libjpeg 来执行此操作?我知道我可以对内存缓冲区进行额外的传递并手动重新排序颜色通道,但是我正在处理的应用程序对时间非常关键,并且必须尽可能快且尽可能高效。

4

6 回答 6

10

为您提供多种解决方案:

  • 按照建议进行转换。如果您处理 4 个像素的组,您可以使用三个 32 位读取和写入、位掩码和移位来完成所有操作,并且速度非常快。
  • 修改 libjpeg 的 YUV 到 RGB 转换或之后的阶段,以便交换 R 和 B。
  • 使用libjpeg-turbo。它向后兼容 libjpeg,具有 SIMD 加速功能,并提供JCS_EXT_BGR色彩JCS_EXT_BGRX空间。
  • 修改您的源图像,以便交换它们的 R 和 B 通道。听起来很傻,但它需要零源代码修改。

此外,您说您追求速度,但您操作 BGR 数据(而不是 BGRX)。这对我来说没有多大意义,因为在 32 位边界上对齐像素可能会快得多。

于 2011-04-11T11:17:10.080 回答
4

正如 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.
 */
于 2013-10-05T10:51:43.890 回答
3

JPEGLIB 表示您必须修改 jmorecfg.h 才能更改通常的 RGB 值顺序。这是文档的链接: http ://www.opensource.apple.com/source/tcl/tcl-20/tcl_ext/tkimg/tkimg/libjpeg/libjpeg.doc 它在数据格式部分

于 2013-02-16T16:01:17.313 回答
1

由于libjpeg的最后一个版本,也可以修改调用后获得的对象的out_color_space属性。cinfojpeg_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;
于 2016-12-20T21:33:43.880 回答
1

看看我的 JPEG 编解码器。

我实际上还没有针对 libjpeg 测试它的速度。如果你能做到这一点,那可能是一个启示。无论如何,解码器都在一个文件中,简单地反转通道的顺序将非常简单。

我在这里维护 JPEG 代码:

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

于 2016-12-20T21:44:21.843 回答
-3

据我所知,Libjpeg 没有办法做到这一点。
无论如何,这只是一个 O(n) 转换。

于 2011-04-11T10:35:08.227 回答