OpenCL有位图的概念吗?

OpenCL有位图的概念吗?,opencl,Opencl,我正在学习OpenCL中的内存缓冲区和图像。据我所知,OpenCL中的图像只是一个抽象的数据结构,与类似照片的图像(x、y、r、g、b或x、y、h、s、l、a或……等等)没有任何关系 在这本书中,我正在阅读他们提供了一种从硬盘上读取.bmp文件并将其转换成浮点数组的方法 然后将浮点数组写入cl_mem变量: // GET THE .BMP AS A FLOAT[] float* inputImage = readImage(inputFile, &imageWidth, &ima

我正在学习OpenCL中的内存缓冲区和图像。据我所知,OpenCL中的图像只是一个抽象的数据结构,与类似照片的图像(x、y、r、g、b或x、y、h、s、l、a或……等等)没有任何关系

在这本书中,我正在阅读他们提供了一种从硬盘上读取.bmp文件并将其转换成浮点数组的方法

然后将浮点数组写入cl_mem变量:

// GET THE .BMP AS A FLOAT[]
float* inputImage = readImage(inputFile, &imageWidth, &imageHeight);

// DEFINE THE IMAGE AND FORMAT 
cl_image_desc desc;
desc.image_type = CL_MEM_OBJECT_IMAGE2D;
desc.image_width = imageWidth;
desc.image_height = imageHeight;
desc.image_depth = 0;
desc.image_array_size = 0;
desc.image_row_pitch = 0;
desc.image_slice_pitch = 0;
desc.num_mip_levels = 0;
desc.num_samples = 0;
desc.buffer = NULL;
cl_image_format format;
format.image_channel_order = CL_R;     
format.image_channel_data_type = CL_FLOAT; 

// DEFINE AND WRITE THE IMAGE
cl_mem d_inputImage = clCreateImage(context, CL_MEM_READ_ONLY, &format, &desc, NULL, NULL);
ize_t origin[3] = { 0, 0, 0 };  
size_t region[3] = { imageWidth, imageHeight, 1 }; 
clEnqueueWriteImage(queue, d_inputImage, CL_FALSE, origin, region, 0, 0, inputImage, 0, NULL, NULL);
那么,这些是否告诉OpenCL我们正在处理一个类似照片的图像,或者我们只是定义了一个数据结构?在本书的核心部分,他们使用:

// sourceImage is d_inputImage from the previous block of code. its type is image2d_t
float4 pixel;
pixel = read_imagef(sourceImage, sampler, coords);
sum.x += pixel.x * filter[filterIdx++];
OpenCL只是松散地将这些数据结构用作类似照片的图像,还是在某种程度上类似于.NET,在.NET中,您可以从许多不同的源创建位图对象,然后一旦拥有该对象,您可以对其执行任何操作?

是和否:

OpenCL有位图的概念吗

不,作为实际的位图(c)(R)(tm)图像文件格式,但它在内存中具有位图(图像)的一般抽象/概念。后者与前者不同!文件格式是一个简单的RIFF资源容器,而后者是一个通用概念

它是否与.NET类似,您可以从许多不同的源创建位图对象

不可以。您不能简单地读取或写入各种文件格式

OpenCL只是松散地将这些数据结构用作类似照片的图像吗

是的(有点多)

OpenCL
确实知道内存中的原始图像格式,但支持不包括PNG、JPG或其他实际文件格式
OpenCL
没有像
.NET类库
那样全面支持图像文件格式。(但这是正确的,因为这根本不是
OpenCL
的目标或角色。
OpenCL
.NET
在这方面是不可比较的,它们是完全不同的动物。)

.NET可以读取和写入许多不同的文件格式
OpenCL
可以处理各种原始格式(不同的RGB顺序和位深度),只要它们存储在内存中。但是,您的任务是找到如何从实际文件中读取/写入原始数据的方法:OpenCL不支持JPG、PNG、GIF或其他现成的压缩和文件格式。例如,如果您想读/写
JPEG
,则可以使用,类似于
PNG
,依此类推。这些库都是开源的,这就是整个生态系统的组合方式

这可能也是为什么这本书提供了一个简单的例程来读写
BMP
raw格式的一小部分。(位图可以有多种颜色深度,
RLE
压缩等)。因此请记住,book例程只能处理
BMP
的一个特定“子格式”。我建议在真实场景中使用
PNG
,因为原始数据可能会占用惊人的巨大空间,这会降低性能(当然,压缩运行时本身也存在权衡)。 关于本书的例程还有一件事:它是根据
OpenCL
内核需要定制的,它提供浮点数组,而且它只有一个通道(
format.image\u channel\u order=CL\u R;
)。通常从图像库接收整数
RGB
颜色通道组件。但将其转换为float并没有什么大不了的(除非您有大量数据)。

是和否:

OpenCL有位图的概念吗

不,作为实际的位图(c)(R)(tm)图像文件格式,但它在内存中具有位图(图像)的一般抽象/概念。后者与前者不同!文件格式是一个简单的RIFF资源容器,而后者是一个通用概念

它是否与.NET类似,您可以从许多不同的源创建位图对象

不可以。您不能简单地读取或写入各种文件格式

OpenCL只是松散地将这些数据结构用作类似照片的图像吗

是的(有点多)

OpenCL
确实知道内存中的原始图像格式,但支持不包括PNG、JPG或其他实际文件格式
OpenCL
没有像
.NET类库
那样全面支持图像文件格式。(但这是正确的,因为这根本不是
OpenCL
的目标或角色。
OpenCL
.NET
在这方面是不可比较的,它们是完全不同的动物。)

.NET可以读取和写入许多不同的文件格式
OpenCL
可以处理各种原始格式(不同的RGB顺序和位深度),只要它们存储在内存中。但是,您的任务是找到如何从实际文件中读取/写入原始数据的方法:OpenCL不支持JPG、PNG、GIF或其他现成的压缩和文件格式。例如,如果您想读/写
JPEG
,则可以使用,类似于
PNG
,依此类推。这些库都是开源的,这就是整个生态系统的组合方式

这可能也是为什么这本书提供了一个简单的例程来读写
BMP
raw格式的一小部分。(位图可以有多种颜色深度,
RLE
压缩等)。因此请记住,book例程只能处理
BMP
的一个特定“子格式”。我建议在真实场景中使用
PNG
,因为原始数据可能会占用惊人的巨大空间,这会降低性能(当然,压缩运行时本身也存在权衡)。 关于本书的例程还有一件事:它是根据
OpenCL
内核需要定制的,它提供浮点数组,而且它只有一个通道(
format.image\u channel\u order=CL\u R;
)。通常从图像库接收整数
RGB
颜色通道组件。但将其转换为浮动也没什么大不了的(