SWT:从图像中获取子图像

SWT: Get sub image from image

假设我选择了矩形(x、y、宽度和高度)。是否可以从 Java SWT 中的图像获取子图像?

我在 Canvas 上有一个 Image。用户选择图像的一部分。我想用用户选择替换图像。

我找不到实现此目的的方法。我使用的是 Canvas 的问题吗?

更新: 这是我目前使用 drawImage 的方法。我想这有点麻烦,因为我没有获取图像的子集并创建新图像 - 我只是绘制图像的一部分:

            int minX = Math.min(startX, endX);
            int minY = Math.min(startY, endY);

            int maxX = Math.max(startX, endX);
            int maxY = Math.max(startY, endY);

            int width = maxX - minX;
            int height = maxY - minY;
            gc.drawImage(image, minX, minY, width, height, image.getBounds().x,  
            image.getBounds().y, image.getBounds().width, image.getBounds().height );

您可以使用方法 Canvas#copyArea(Image, int, int) 将您感兴趣的区域复制到给定的 Image。然后将 Image 设置为 Label:

private static boolean drag = false;

private static int xStart;
private static int yStart;

private static int xEnd;
private static int yEnd;
private static Image outputImage = null;

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("Whosebug");
    shell.setLayout(new FillLayout());

    Image inputImage = new Image(display, "baz.png");
    Label output = new Label(shell, SWT.NONE);

    Canvas canvas = new Canvas(shell, SWT.DOUBLE_BUFFERED);

    canvas.addListener(SWT.Paint, e -> e.gc.drawImage(inputImage, 0, 0));

    canvas.addListener(SWT.MouseDown, e -> {
        xStart = e.x;
        yStart = e.y;
        drag = true;
    });

    canvas.addListener(SWT.MouseUp, e -> {
        drag = false;

        int x = Math.min(xStart, xEnd);
        int y = Math.min(yStart, yEnd);

        if (outputImage != null && !outputImage.isDisposed())
            outputImage.dispose();

        outputImage = new Image(display, new Rectangle(x, y, Math.abs(xEnd - xStart), Math.abs(yEnd - yStart)));
        GC gc = new GC(inputImage);

        gc.copyArea(outputImage, x, y);
        output.setImage(outputImage);

        gc.dispose();
    });
    canvas.addListener(SWT.MouseExit, e -> drag = false);

    canvas.addListener(SWT.MouseMove, e -> {
        if (drag)
        {
            xEnd = e.x;
            yEnd = e.y;
        }
    });

    shell.pack();
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
    inputImage.dispose();
    if (outputImage != null && !outputImage.isDisposed())
        outputImage.dispose();
}

看起来像这样: