2016-05-04 15 views
1

私はいくつかのガイダンスが必要ですが、これには別の質問がありません。答えは、JavaFX仕様である必要はありません。JavaFXで大きな画像をロードして処理する最も効率的な方法

かなり大きい画像/ピクセル配列をJavaFXアプリケーションで読み込んで操作するのが好きです。

今私は単純なアプローチをとっています:キャンバスオブジェクトを保持する単純なStackpaneは、ScrollPaneにロードされます。

ScrollPane scrollPane = new ScrollPane(); 
StackPane stackPane = new StackPane(); 
Canvas = new Canvas(4000,6000); 

stackPane.getChildren().add(canvas); 
scrollPane.setContent(stackPane); 
root.setCenter(scrollPane); 

特定のキャンバス化でCanvasオブジェクトを作成することはできませんが、いくつかの例外があります。私の心の中でもっと大きな次元を持っていたら?

キャンバスの合計サイズは、スクロールペインのパフォーマンスまたは詳細ビューに影響しますか?

+0

あなたの質問から、画像について話している間に「キャンバス」を使う理由は明確ではありません。 JavaFXの私の考えでは、これは 'Image'と' ImageView'を意味します。どうか明らかにしてください。 – hotzst

+0

誰かがキャンバスは、ピクセル配列を使って作業するとパフォーマンスが向上すると教えてくれました。 – user6272596

答えて

3

特定のキャンバス化でCanvasオブジェクトを作成することはできませんが、いくつかの例外があります。

デフォルトでは、JavaFXノードはグラフィックスハードウェアによってテクスチャとしてレンダリングされます。異なるグラフィックスハードウェアは、単一のテクスチャが可能な最大サイズにおいて異なる限界を有する。通常、このテクスチャサイズの制限は2のオーダーであり、さまざまなグラフィックスハードウェアの一般的な最大値は8192x8192または16384x16384です。互換性の理由から、非常に慎重にしたい場合は、8192x8192または4096x4096の最大テクスチャサイズを仮定するのが最善の方法です。

私の心の中でもっと大きな次元があったらどうなりますか?

タイルアルゴリズムで複数のノードを使用します。たとえば、64個の4096x4096個のキャンバスノードからなる8x8配列を使用して32768x32768キャンバスを作成します。あなたはこれを自分で処理するためのロジックを書く必要があります。私が知る限り、あなたのためにそれを行う既存のライブラリはありません。例えば、数百または数百万のピクセルを使用する場合は、GridViewのような仮想化されたコントロールが役立ちます。

誰かが、私はキャンバスがサービスに必要とキャンバスは、PixelWriterPixelReaderに裏打ちされたWritableImageよりも優れた性能特性を持っているだろうことを疑う

画素配列を扱う際のキャンバスがより良い性能を持っている私に言いましたより幅広くより複雑な特徴と機能の配列つまり、ほとんどのアプリケーションでは、キャンバスのパフォーマンスとWritableImageのパフォーマンスの間に大きな違いは見られない可能性が高いため、アプリケーションの機能に最適な機能を選択する必要があります。さておき、ある性能チップとして

画像データの画素レベルの操作で作業する場合、それはデータコピーとその画素データの変換の量を減少させるようにネイティブに、グラフィックハードウェアによって使用される適切なPixelFormatを選択することです基礎となるグラフィックスレンダリングシステムが行う必要があります。このパフォーマンス・ヒントの詳細は、関連するOracle JavaFXフォーラム・スレッドCanvas performanceを参照してください。

+0

ここにはうれしい情報がたくさんあります。 – XaolingBao

1

キャンバスにはPixelReaderが用意されていないため、ここでキャンバスを使用することはあまり良い考えではありません。あなたがピクセルで得ることができる唯一の方法は、スナップショットを作ることです。画像には、PixelReaderとPixelWriterの両方があります。私は、深刻な画像操作プログラムが両方向で個々のpixeslを操作することができなくても機能するとは思っていません。

関連する問題