OpenCL image2d像素编辑

时间:2013-12-08 11:35:05

标签: image opencl pixel

我是OpenCL的新手,但我有一个在OpenCL做的项目,我被卡住了。 我需要加载图像(bmp),将其投入GPU,更改一些像素并将其保存到新的bmp文件中。当我只是复制图像或反转红色/绿色调色板时,一切正常。但是当我试图将2,4,6 ....像素列更改为黑色时,我得到了错误: CL_INVALID_KERNEL_NAME。 正如我所说,我是一个新手,我缺乏想法。但我确信整个主要代码是100%有效的,问题在于内核:

#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable

__kernel void image_change(__read_only image2d_t image1, __write_only image2d_t image2)
{
const sampler_t sampler=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;

int x = get_global_id(0);
int y = get_global_id(1);
int2 pixelcoord;
float4 pixel = read_imagef(image1, sampler, pixelcoord(x,y));
float4 blackpixel = (float4)(0,0,0,0);
width = get_image_width(image1);
height = get_image_height(image1);
for (pixelcoord.x=x-width; pixelcoord.x<width; pixelcoord.y++)
{
    if(pixelcoord.x % 2 == 0)
    {
    for (pixelcoord.y=y-height; pixelcoord.y<height; pixelcoord.y++) 
        write_imagef(image2, pixelcoord, pixel);
    }
    else
    {
    for (pixelcoord.y=y-height; pixelcoord.y<height; pixelcoord.y++) 
        write_imagef(image2, pixelcoord, blackpixel);
    }
}
}

我确信第一个“for”的代码中有一些不好的内容。

  1. 为什么我收到此错误(coz内核名称100%正常)?
  2. 如何更改像素? (我的意思是我不知道如何访问某些像素及其颜色)
  3. 如果有人能指导我,我会很高兴。

1 个答案:

答案 0 :(得分:1)

解决了!我发现了一个帖子,它解释了它是如何工作的。首先,我没有初始化宽度和高度(孩子的错误)。其余的更容易了。 代码:

__kernel void image_change(__read_only image2d_t image1, __write_only image2d_t image2)
{
const sampler_t sampler=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;


int width = get_image_width(image1);
int height = get_image_height(image1);

int2 pixelcoord = (int2) (get_global_id(0), get_global_id(1));
if (pixelcoord.x < width && pixelcoord.y < height)
{   
    float4 pixel = read_imagef(image1, sampler, (int2)(pixelcoord.x, pixelcoord.y));
    float4 black = (float4)(0,0,0,0);

if (pixelcoord.x % 2== 1)
{   
    const float4 outColor = black;
    write_imagef(image2, pixelcoord, outColor);
}
else
    write_imagef(image2, pixelcoord, pixel);

}
}