翻译什么 Java 颜色到整数?

What to translate Java Color to integer?

我需要将一组颜色从 Java 传输到 OpenCL,我只是想知道最好将它们转换为哪种类型。在某些语言中,Color 只是一个 32 位整数,Java 文档有时也暗示它也是如此,但我从未看到明确提及这一点。由于 OpenCL 只知道基本类型,所以我想将颜色数组转换为整数数组,对其进行处理,然后再将其转换回来。是awt Color还是javaFX color重要吗?

感谢您的宝贵时间。

如果颜色是 32 位整数,了解该整数的编码方式很重要。

RGB(A)是一个32位整数的编码,前8位是红色强度,接下来的8位是绿色强度,接下来的8位是蓝色强度,最后8位(如果使用)是透明的。

但是,该 32 位整数可能编码完全不同的颜色,如 CMYK 颜色,或不同颜色系统的颜色。

用 32 位整数对颜色进行编码并没有什么神奇之处,但是没有可以对每种颜色进行编码的标准编码,而且 32 位整数中也没有空间来指定使用了哪种编码。所以,不,没有通用的解决方案。

一旦您知道所需的编码或您将选择的编码,该编码将告诉您是否可以将其打包成 32 位整数,以及打包顺序和其他设置位的详细信息该整数包含。

您可以创建自己的 api,将一些已知格式转换为您自己的格式,然后在任何地方使用,无论是 opencl 还是 cuda。

然后可以在上面加一个function/method,将红色数组、绿色数组、蓝色数组等颜色元素数组分开,送入gpu。您可以直接使用 float4、int4、char4,但我不确定您是否不需要混合类型。比如8bit整数red+8bit整数green+8bit整数blue+32bit浮点透明度。这些 user-defined 结构可能存在可移植性问题,并且在分离为原始数组时会更好。

HARDWARE/API ---> YOUR API ----> REDs ---> opencl buffer  >--┓
                       |                                     |
                       └-----> GREENs ---> opencl buffer  >--┨
                         |                                   |
                         └-----> BLUEs ---> opencl buffer >--┨
                                              |              |
                                              └--<-- GPU  <--┘

转换为您的 api 的开销可以通过流水线化来克服,如果这类似于视频源。

当有帧流数据时,一个步骤可以包括并发子步骤,如:

  • 您的 api 将输入转换为您的 X 帧格式
  • 您的格式将其颜色复制到帧 X-1 的 opencl 缓冲区
  • 将帧 X-2 的缓冲区复制到 GPU
  • 在 gpu 上计算帧 X-3
  • 将帧 X-4 的结果复制回主机
  • 将结果缓冲区转换为帧 X-5
  • 的相关 hardware/api 类型颜色编码

从开发者的角度来看:

parallel_for
  processedImg[X]=myApi.getPixels(javaPicture[X]);
  processedImg[X-1].toOpenClBuffers();
  processedImg[X-2].compute();
  processedImg[X-3].toSourceFormat();
  ..