在SWT中绘制形状后从Canvas获取图像

问题描述 投票:0回答:1

我试图在 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)
...

有谁知道为什么即使我可以看到屏幕中的形状,画布似乎还是空的?

canvas swt
1个回答
0
投票

绘制监听器应该只绘制控件。绘图写入控件的确切时间尚未定义,并且可能因平台而异。您应该假设直到代码从绘制侦听器返回后才完成。

作为行为变化的一个示例,您的代码会在 macOS 上产生堆栈溢出,因为绘制事件是由

print
调用递归调用的。

因此

print
和额外数据的代码应该与绘制分开完成。

© www.soinside.com 2019 - 2024. All rights reserved.