JavaFx中图像的子矩形

时间:2012-11-17 00:06:01

标签: javafx-2

我有一个javafx.scene.image.Image,需要创建一个带有子矩形的新图像。我已经尝试了PixelReader.getPixels,但它要求WritablePixelFormat,我不知道如何使用它。

1 个答案:

答案 0 :(得分:0)

我建议你做的是实例化一个 Canvas ,只是你的子矩形的大小,并使用其GraphicsContext绘制那里的源图像片段。完成后,使用Canvas,就像使用ImageView一样。

我在一个类中切割图像并为您提供这些内容。

基本上步骤是:

  1. 创建子矩形大小的Canvas节点
  2. 获取Canvas的GraphicsContext
  3. 使用您的图像作为源,绘制到Canvas
  4. 将您的画布插入场景或适当的地方
  5. 这是用于绘图的GraphicsContext:

    public void drawImage(Image img,
                 double srcX,
                 double srcY,
                 double srcWidth,
                 double srcHeight,
                 double destX,
                 double destY,
                 double destWidth,
                 double destHeight)
    

    以下是我在Scala中绘制图像“切片”的代码:

    import javafx.scene.image.Image
    import javafx.scene.canvas.Canvas
    
    class Slicer(val img: Image, val xAmount: Int, val yAmount: Int) {
    
      val sliceWidth = img.getWidth() / xAmount
      val sliceHeight = img.getHeight() / yAmount
    
      def sliceAt(x: Int, y: Int): Canvas = {
        val canvas = new Canvas(sliceWidth, sliceHeight)
        val grContext = canvas.getGraphicsContext2D()
    
        val (sourceX, sourceY) = coordinatesOfSliceAt(x, y)
        val (destX, destY) = (0, 0)
    
        grContext.drawImage(img,
          sourceX, sourceY, sliceWidth, sliceHeight,
          destX, destY, sliceWidth, sliceHeight)
    
        canvas
      }
    
      def coordinatesOfSliceAt(x: Int, y: Int): (Int, Int) = {
        val coordX = ((x - 1) * sliceWidth).toInt
        val coordY = ((y - 1) * sliceHeight).toInt
        (coordX, coordY)
      }
    
    }
    

    当我遇到这个时,我找到了这个解决方案:

    http://docs.oracle.com/javafx/2/image_ops/jfxpub-image_ops.htm

    相关部分是他们将原始图像的片段绘制到画布上。因此,无需处理PixelReaders或Writers。