翻译什么 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();
..
我需要将一组颜色从 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();
..