JavaCL-翻转输入图像
我正在使用JavaCL,我想旋转图像并将图像保存回“out.png”。 不幸的是,代码行:JavaCL-翻转输入图像,java,opencl,gpu,Java,Opencl,Gpu,我正在使用JavaCL,我想旋转图像并将图像保存回“out.png”。 不幸的是,代码行: write_imagef(output, (int2){coords.y, coords.x}, pixel ); (x和y坐标切换)似乎没有任何影响。我可以做任何我想做的,但结果仍然是原来的形象为什么输出不受影响? CopyImagesExample.java import static java.lang.Math.cos; import static java.lang.M
write_imagef(output, (int2){coords.y, coords.x}, pixel );
(x和y坐标切换)似乎没有任何影响。我可以做任何我想做的,但结果仍然是原来的形象为什么输出不受影响?
CopyImagesExample.java
import static java.lang.Math.cos;
import static java.lang.Math.sin;
import static org.bridj.Pointer.allocateFloats;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteOrder;
import javax.imageio.ImageIO;
import org.bridj.Pointer;
import com.nativelibs4java.opencl.CLBuffer;
import com.nativelibs4java.opencl.CLContext;
import com.nativelibs4java.opencl.CLDevice;
import com.nativelibs4java.opencl.CLEvent;
import com.nativelibs4java.opencl.CLImage2D;
import com.nativelibs4java.opencl.CLKernel;
import com.nativelibs4java.opencl.CLMem.Usage;
import com.nativelibs4java.opencl.CLSampler;
import com.nativelibs4java.opencl.CLSampler.AddressingMode;
import com.nativelibs4java.opencl.CLSampler.FilterMode;
import com.nativelibs4java.opencl.CLProgram;
import com.nativelibs4java.opencl.CLQueue;
import com.nativelibs4java.opencl.JavaCL;
import com.nativelibs4java.util.IOUtils;
public class CopyImagesExample {
public static void main(String[] args) throws IOException {
CLContext context = JavaCL.createBestContext();
CLQueue queue = context.createDefaultQueue();
ByteOrder byteOrder = context.getByteOrder();
CLDevice[] devices = context.getDevices();
System.out.println("Devices count " + context.getDeviceCount());
System.out.println(devices[0].getMaxComputeUnits());
System.out.println(devices[0].getOpenCLVersion());
int n = 1024;
Pointer<Float> aPtr = allocateFloats(n).order(byteOrder);
Pointer<Float> bPtr = allocateFloats(n).order(byteOrder);
Pointer<Float> oPtr = allocateFloats(n).order(byteOrder);
for (int i = 0; i < n; i++) {
aPtr.set(i, (float) cos(i));
bPtr.set(i, (float) sin(i));
}
// Create OpenCL input buffers (using the native memory pointers aPtr
// and bPtr) :
BufferedImage img = ImageIO.read(new FileInputStream("images/lena256.png"));
CLImage2D inputImage = context.createImage2D(Usage.Input, img, false);
// Create an OpenCL output buffer :
CLImage2D outImage = context.createImage2D(Usage.Output, img, false);
CLSampler sampler = context.createSampler(false, AddressingMode.ClampToEdge, FilterMode.Nearest);
// Read the program sources and compile them :
String src = IOUtils.readText(CopyImagesExample.class
.getResource("CopyImage.cl"));
CLProgram program = context.createProgram(devices, src);
// Get and call the kernel :
CLKernel nnKernel = program.createKernel("rotate_image");
nnKernel.setArgs(inputImage, outImage, sampler);
CLEvent addEvt = nnKernel.enqueueNDRange(queue, new int[] { img.getWidth()*img.getHeight() });
BufferedImage outPtr = outImage.read(queue, addEvt); // blocks until
// add_floats
// finished
ImageIO.write(outPtr, "png", new File("out.png"));
}
}
输入:
输出:
但所需的输出是图像旋转(每个像素的x和y坐标被切换)。快速修复:替换代码:
CLEvent addEvt = nnKernel.enqueueNDRange(queue, new int[] { img.getWidth()*img.getHeight() });
与:
原因是,在我使用的OpenCL代码中
get_global_id(0)
及
所以我需要在2D范围内排队
CLEvent addEvt = nnKernel.enqueueNDRange(queue, new int[] { img.getWidth(), img.getHeight() });
get_global_id(0)
get_global_id(1)