2016-05-30 23 views
0

私は四角形の選択(x、y、幅と高さ)を持っていると仮定します。 Java SWTの画像からSub Imageを取得することは可能ですか?SWT:画像からサブ画像を取得する

私はCanvasImageを持っています。ユーザは、画像のセクションを選択する。画像をユーザーの選択に置き換えたいと思います。

私はこれを達成する方法を見つけることができません。問題は私が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); 

答えて

2

あなただけコピーする方法Canvas#copyArea(Image, int, int)を使用することができますあなたが興味を持っている地域は、Imageです。その後LabelImageを設定します。

enter image description here

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("Stackoverflow"); 
    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(); 
} 

は次のようになります

関連する問題