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

絵を 4 ピースまたは 9 ピースにカットする場合 (このゲームは幼児向けです) は問題ありませんが、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 を参照できます。イメージ自体のデータは Image に格納されます。それぞれが同じ Image を参照する 1000 個の ImageView オブジェクトがある場合、メモリ内にはピクセルのコピーが 1 つしかありません。実際には、WriteableImage を使用してコピーを作成すると、複数の ImageView オブジェクトを作成するよりもコストがかかります。

于 2013-09-20T00:02:31.500 に答える