6

我正在尝试使用 JavaFX 编写拼图游戏,部分原因是有人问我,部分原因是我想尝试使用 JavaFX。但是,我在实际裁剪图像时遇到了困难。

这个想法是让用户提供图像和程序以将图像切割成更小的部分。很简单,对吧?我的问题是:我能找到剪切图像的唯一方法是制作图像对象的副本并更改副本的可见部分,这是一个示例:

ImageView imgageView = new ImageView(); // Creates a new ImageView; this will be a single puzzle piece.
imgageView.setImage(originalImage); // Use the original image as the "base."
Rectangle2D rectangle = new Rectangle2D(0, 0, 50, 50); // Crop the image from (0,0) to (50, 50).

只是为了澄清最后一行,这里是API 中的相关部分

public Rectangle2D(double minX,
           double minY,
           double width,
           double height)
Creates a new instance of Rectangle2D.
Parameters:
minX - The x coordinate of the upper-left corner of the Rectangle2D
minY - The y coordinate of the upper-left corner of the Rectangle2D
width - The width of the Rectangle2D
height - The height of the Rectangle2D

现在,如果我将图片切成四或九块(该游戏是为幼儿设计的),这很好,但如果我想将图片切成一个漂亮的 1200 块拼图怎么办?这不会导致极其昂贵的操作吗?不仅是裁剪本身,还要在内存中保留那么多图像副本。看,如果我正确理解这一点,每一块都将包含整个原始图像,其中很大一部分将保持“隐藏”。

我只是误解了这个功能吗?如果没有,那么一定有更好的方法来做到这一点,对吧?

4

2 回答 2

18

使用 PixelReader 和 WritableImage 应该会有所帮助。

以下从旧图像中切出新position (x,y)图像size (width, height)

PixelReader reader = oldImage.getPixelReader();
WritableImage newImage = new WritableImage(reader, x, y, width, height);
于 2013-03-23T14:23:29.413 回答
12

多个 ImageView 对象可以引用同一个 Image。图像本身的数据存储在图像中。如果您有 1000 个 ImageView 对象,每个对象都引用同一个 Image,那么内存中只有 1 个像素副本。使用 WriteableImage 创建副本实际上比拥有多个 ImageView 对象更昂贵。

于 2013-09-20T00:02:31.500 回答