当使用 libjpeg 将图像输入 OpenCL 时,为了能够将通道视为标准化的 uint8 CL_UNORM_INT8
(浮点数在 range 内[0.0, 1.0]
),您只能将其输入具有 4 个通道分量的缓冲区。这是有问题的,因为 libjpeg 只输出 3(默认情况下按 RGB 顺序),因为 JPEG 没有不透明度的概念。
我看到的唯一解决方法是使用 libjpeg 扫描线,然后制作适当长度的重复缓冲区(为扫描线中的每个像素添加第四个通道分量),然后memcpy
将值设置为每个值,将 alpha 分量设置255
为每个。如果您很棘手,您甚至可以在原地执行此操作并将缓冲区初始化为row_stride * 4
初始状态,然后从 index 向后移动row_stride * 3 - 1
到0
,将组件移动到完整缓冲区中的适当位置(并255
在必要时添加 alpha)。
但是,这感觉很麻烦,如果您正在处理大图像(我是),那么让这个额外的传递(将汇总)整个图像是不可接受的。
那么,有没有办法让 libjpeg 将组件的数量扩展到 4 个?我尝试过设置属性cinfo
,output_components
但无济于事。我读过唯一的解决方法是编译一个特殊版本的 libjpeg 并设置常量RGB_COMPONENTS = 4
in jmorecfg.h
,但这肯定感觉不便携,或者对于这种(常见)输出更改而言是必要的。