2017-06-08 9 views
2

javafxのキャンバスに拡大縮小画像を描画しようとしています。このコードを使用する:javafxのキャンバスにdrawImageの線形フィルタリングを無効にする方法

Image image = ...; 
canvas.setWidth(scale * width); 
canvas.setHeight(scale * height); 
GraphicsContext gc = canvas.getGraphicsContext2D();  
gc.drawImage(image, 0, 0, scale * width, scale * height); 
// this gives same result 
// gc.scale(scale, scale); 
// gc.drawImage(editableImage, 0, 0, width, height); 

をそれは本当に速く動作しますが、このようにぼやけた画像を作る:

enter image description here

これは私が見てみたいものではありません。代わりに、私はこの絵を取得したい:手動でこのようなコードで、各ピクセルの色を設定することで描画できる

enter image description here

:それはあまりにも遅いですよう

PixelReader reader = image.getPixelReader(); 
PixelWriter writer = gc.getPixelWriter(); 
for (int y = 0; y < scale * height; ++y) { 
    for (int x = 0; x < scale * width; ++x) { 
     writer.setArgb(x, y, reader.getArgb(x/scale, y/scale)); 
    } 
} 

しかし、私はこのアプローチを使用することはできません。 1Kbの画像を8倍に拡大するには数秒かかりました。だから私はキャンバスで描くためにこのぼやけた効果を無効にする方法があるかどうか尋ねる?

+0

関連する場合もありますが、おそらく重複:https://stackoverflow.com/questions/16089304/javafx-imageview-without-any-smoothing – fabian

+0

@fabianこの疑問は、ImageViewについてです。キャンバスはかなり異なっています。 – Nolan

答えて

2

私は私の質問に答えを見つけたと思います。 this issueによると、グラフィックスコンテキストでフィルタリングオプションを指定する方法はないという。

説明:

大きなキャンバスに小さな画像を拡大するためのdrawImage() 方法を用いGraphicsContextに画像を描画する画像であるが、おそらくバイリニア法やバイキュービック法アルゴリズムを使用して( が補間されます)。しかし、 補間をしたくない色マップ(温度、 動物園、塩分など)またはいくつかの地理的データ(母集団 濃度など)をレンダリングするときは、 のような時があります。アルゴリズム)を使用して、 の正確なデータと形状を表します。

Java2Dでは、適切な RenderingHints.KEY_RENDERINGをすぐにGraphics2Dに設定することで可能です。現在、 にあるJavaFXのGraphicsContextには、画像 の補間方法を指定する方法はありません。

イメージを縮小する場合も同様です。

この

イメージとImageViewの両方で使用可能です 「滑らかな」値を平滑化のよりよい形をサポートするように拡張することができ、 こと(少なくともWindows上で)、現在非常にうまく動作するようには思えません。

問題は2013年に作成されましたが、まだ修正されていないため、間もなく解決される可能性は低いです。

関連する問題