【问题标题】:How to read color of a pixel on SWT canvas at mouse pointer?如何在鼠标指针处读取 SWT 画布上像素的颜色?
【发布时间】:2013-04-18 05:23:50
【问题描述】:

我写了一个小程序来读取鼠标指针位置像素的颜色。但我没有得到鼠标指针的颜色,RGB {0, 0, 0} 总是在控制台上打印。请修复/更正下面的程序,以便在鼠标指针处打印像素的颜色。

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class PixelColorPick {
    private static final int RECT_HEIGHT = 20;
    private static final int RECT_WIDTH = 20;
    private static final int CYCLE_OFFSET = 0;
    protected static final int Y_STEP = 20;
    static int shellStyle = SWT.NO_REDRAW_RESIZE | SWT.NO_BACKGROUND | SWT.CLOSE | SWT.RESIZE;
    static int canvasStyle = SWT.NO_REDRAW_RESIZE | SWT.H_SCROLL | SWT.V_SCROLL;

    public static void main(String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display, shellStyle);
        shell.setLayout(new FillLayout());
        shell.setBackground(display.getSystemColor((SWT.COLOR_CYAN)));
        shell.setText("Canvas Test");
        shell.setSize(400, 300);

        Composite composite = new Composite(shell, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        composite.setLayout(new GridLayout(1, false));

        final Canvas canvas = new Canvas(composite, canvasStyle);
        canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
        canvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        final Point cycleOrigin = new Point(CYCLE_OFFSET, 0);

        // Create a paint handler for the canvas
        canvas.addPaintListener(new PaintListener() {
            @Override
            public void paintControl(PaintEvent e) {

                for (int i = 0; i < 100; i++) {                    
                    for (int j = 0; j < 100; j++) {                     
                        Color oldBgColor = e.gc.getBackground();
                        Color oldFgColor = e.gc.getForeground();
                        if(j%2 == 0) {
                            e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_RED));                            
                            e.gc.drawRectangle(cycleOrigin.x + j * RECT_WIDTH, cycleOrigin.y + i * Y_STEP, RECT_WIDTH, RECT_HEIGHT);                        
                            e.gc.fillRectangle(cycleOrigin.x + 1 + j * RECT_WIDTH, cycleOrigin.y + 1 + i * Y_STEP, RECT_WIDTH - 1, RECT_HEIGHT -1);
                            e.gc.setBackground(oldBgColor);
                            e.gc.setForeground(oldFgColor);
                        } else if(j%3 == 0) {
                            e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_DARK_MAGENTA));
                            e.gc.drawRectangle(cycleOrigin.x + j * RECT_WIDTH, cycleOrigin.y + i * Y_STEP, RECT_WIDTH, RECT_HEIGHT);                        
                            e.gc.fillRectangle(cycleOrigin.x + 1 + j * RECT_WIDTH, cycleOrigin.y + 1 + i * Y_STEP, RECT_WIDTH - 1, RECT_HEIGHT -1);
                            e.gc.setBackground(oldBgColor);
                            e.gc.setForeground(oldFgColor);
                        } else {
                            e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_GREEN));
                            e.gc.drawRectangle(cycleOrigin.x + j * RECT_WIDTH, cycleOrigin.y + i * Y_STEP, RECT_WIDTH, RECT_HEIGHT);                        
                            e.gc.fillRectangle(cycleOrigin.x + 1 + j * RECT_WIDTH, cycleOrigin.y + 1 + i * Y_STEP, RECT_WIDTH - 1, RECT_HEIGHT -1);
                            e.gc.setBackground(oldBgColor);
                            e.gc.setForeground(oldFgColor);
                        }
                    }
                }
            }

        });
        canvas.addMouseMoveListener(new MouseMoveListener() {

            @Override
            public void mouseMove(MouseEvent e) {
                Image image = new Image(e.display, 20, 20);
                GC gc = new GC(image);
                gc.copyArea(image, e.x, e.y);
                ImageData imageData = image.getImageData();                
                int pixelValue = imageData.getPixel(0, 0);
                PaletteData palette = imageData.palette;
                RGB rgb = palette.getRGB(pixelValue);
                System.out.println(rgb);

            }
        });
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();

    }
}

【问题讨论】:

    标签: java canvas swt ubuntu-12.04 mousemove


    【解决方案1】:

    将这些行更新为:

    Image image = new Image(e.display, 20, 20);
    GC gc = new GC(image);
    gc.copyArea(image, e.x, e.y);
    

    这个:

    Image image = new Image(e.display, 1, 1);
    GC gc = new GC((Canvas)e.widget);
    gc.copyArea(image, e.x, e.y);
    

    GC gc = new GC((Canvas)e.widget); 很重要。

    并且作为一个好习惯,在你完成后处理 GCimage 对象!

    【讨论】:

    • 它不能完全工作,只有第一个像素颜色正确打印(即当鼠标指针第一次进入画布区域时)。所有下一个鼠标移动事件都在打印 RGB {0, 0, 0}。有什么想法吗?
    • 您使用的是哪个操作系统、SWT、Java 版本?该示例在 Win7、SWT 3.7.2 和 Oracle JDK 1.6_b35 上运行良好。即使您只是将 GC gc = new GC(image); 更新为 GC gc = new GC((Canvas)e.widget); 也可以。
    • 哦。我正在使用 Ubuntu 12.04。 JDK 1.6_b39 和 SWT 4.234(不确定)。是否依赖于操作系统
    • 可能是,因为 SWT 是原生操作系统 API 的精简包装器。此外,正如您提到的,您将获得 RGB {0, 0, 0} 作为输出,但对于我的开发配置,它返回 RGB {255, 255, 255}(在我应用上述修复之前)。可能有你的开发配置的人可能会帮助你。
    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2020-03-22
    相关资源
    最近更新 更多