2

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

4

1 回答 1

0

我建议你做的是实例化一个Canvas只是你的子矩形的大小,并使用它的GraphicsContext在那里绘制你的源图像。之后,像使用 ImageView 一样使用 Canvas。

我在一个将图像切成薄片并给你的课程中这样做。

基本上步骤是:

  1. 创建一个子矩形大小的 Canvas 节点
  2. 获取该 Canvas 的 GraphicsContext
  3. 使用您的图像作为源,在该画布上绘制
  4. 将您的 Canvas 插入您的场景中,或任何适当的地方

这是进行绘图的 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。

于 2013-06-09T18:36:56.487 回答