我试图在 SWT 中基于
Image
获取一个 Canvas
对象,首先我绘制一些随机形状来填充画布,然后我尝试获取图像并读取图像像素,如下所示:
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
// Draw 100 random shapes
for(int a=0; a<100; a++) {
e.gc.setBackground(randomColor());
e.gc.fillOval(randomPosition(), randomPosition(), randomSize(), randomSize());
}
// Create image based on canvas
Image img = new Image(display, canvas.getBounds());
GC imageGC = new GC(img);
canvas.print(imageGC);
imageGC.dispose();
ImageData imageData = img.getImageData();
int width = imageData.width;
int height = imageData.height;
// Get pixels
int[] pixels = new int[width * height];
imageData.getPixels(0, 0, width * height, pixels, 0);
// Display RGB values of each pixel
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int pixelValue = pixels[y * width + x];
int red = pixelValue & 0xFF;
int blue= (pixelValue >> 16) & 0xFF;
int green = (pixelValue >> 8) & 0xFF;
System.out.println("Color of pixel (" + x + ", " + y + "): RGB(" + red + ", " + green + ", " + blue + ")");
}
}
}
});
但是它总是显示以下内容,就好像画布是空的一样:
Color of pixel (0, 0): RGB(0, 0, 0)
Color of pixel (1, 0): RGB(0, 0, 0)
Color of pixel (2, 0): RGB(0, 0, 0)
Color of pixel (3, 0): RGB(0, 0, 0)
Color of pixel (4, 0): RGB(0, 0, 0)
...
有谁知道为什么即使我可以看到屏幕中的形状,画布似乎还是空的?
绘制监听器应该只绘制控件。绘图写入控件的确切时间尚未定义,并且可能因平台而异。您应该假设直到代码从绘制侦听器返回后才完成。
作为行为变化的一个示例,您的代码会在 macOS 上产生堆栈溢出,因为绘制事件是由
print
调用递归调用的。
因此
print
和额外数据的代码应该与绘制分开完成。