简介
在 OpenCL 1.1 中,已经支持对图像的读写。本文描述如何通过 OpenCL API 调用,从一张较大的图像中截取一块矩形区域,供图片浏览器显示。该程序实现的功能和 No.1_YUV420pScissor 类似,不同的是 No.1_YUV420pScissor 中直接对像素数据进行处理,而该程序中通过 OpenCL 内置图像读写函数来对像素数据进行采样。
实现
该程序接收 No.2_2_FreeImage 中由函数 load_image
保存的二进制图像数据,然后通过 OpenCL 来提取其中的部分矩形区域,将该矩形区域保存为二进制图像文件。最后将提取的矩形区域像素使用 No.2_2_FreeImage 中 store_image
函数保存为位图文件,供图片浏览器查看。具体执行流程可参考 No.2_2_FreeImage。
由于截取的矩形区域图像为 256x256,在保存位图文件时需要更新图像格式和尺寸,需要对程序 No.2_2_FreeImage 中对应参数作相关调整,打上如下 patch,内容如下:
+FREE_IMAGE_FORMAT g_format = (FREE_IMAGE_FORMAT)13;
+int g_width = 256, g_height = 256;
完整代码参见 No.1_OpenCLSampler。
1.创建图像对象
缓冲区对象和图像对象都是内存对象,内存对象是对全局内存区域的引用。不同的是图像对象除了像素数据,还包含了对图像格式及图像属性的描述信息,例如图像宽度、高度,以及深度等。
创建了两个图像对象,分别用来存放原始图像数据和目标图像数据。图像对象和缓冲区对象类似,都是 cl_mem 类型。