2016-12-04 11 views
0

ベクトルデータだけでなくラスタも含むスケーリングされたオブジェクトを描画したいと思います。現在、私はスケールGraphics2Dオブジェクト残念ながらJava:スケーリングされたオブジェクトを描く(バッファ付きイメージとベクトルグラフィックス)

protected void paintComponent(Graphics g) { 

    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g.create(); 

    //Get transformation, apply scale and shifts 
    at = g2d.getTransform(); 
    at.translate(x, y); 
    at.scale(zoom, zoom);  

    //Transform Graphics2D object 
    g2d.setTransform(at); 

    //Draw buffered image into the transformed object 
    g2d.drawImage(img, 0, 0, this); 

    //Draw line into transformed Graphics2D object 
    Line2D.Double line = new Line2D.Double(); 
    line.x1 = (int)p1.getX(); 
    line.y1 = (int)p1.getY(); 
    line.x2 = (int)p2.getX(); 
    line.y2 = (int)p2.getY(); 

    g2d.draw(line); 

    g2d.dispose(); 
} 

に描いています、このアプローチはいくつかの欠点を持っている(ストローク幅、ズーム画像のより悪い品質に影響を与えます)。

代わりに、スケールされたオブジェクトを描画したいと思います。ベクトルデータのために、このアプローチは単純である:ただし

protected void paintComponent(Graphics g) { 

    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g.create(); 

    //Update affine transformation 
    at = AffineTransform.getTranslateInstance(x, y); 
    at = AffineTransform.getScaleInstance(zoom, zoom); 

    //Transform line and draw 
    Line2D.Double line = new Line2D.Double(); 
    line.x1 = (int)p1.getX(); 
    line.y1 = (int)p1.getY(); 
    line.x2 = (int)p2.getX(); 
    line.y2 = (int)p2.getY(); 

    g2d.draw(at.createTransformedShape((Shape)line)); 

    //Transform buffered image and draw ??? 
    g2d.draw(at.createTransformedShape((Shape)img)); //Error 

    g2d.dispose(); 
} 

、Graphics2Dオブジェクトを再スケーリングすることなく、バッファリングされたイメージに変換を適用する方法?ラスター画像、ベクターシェイプとして理解することができないので、このアプローチは...あなたの助けのための

感謝を

g2d.draw(at.createTransformedShape((Shape)img)); 

を動作しません。

+0

代わりに '// ERROR'でマークされている行の、あなたは' g2d.transformを(行うことができますat); g2d.drawImage(img、0、0、null); '。品質に問題がある場合は、Graphics2Dのレンダリングヒントを変更することを検討してください。 – Marco13

答えて

1

可能な解決策は、ラスタのアフィン変換を表すことができる:

//Update affine transformation 
at = AffineTransform.getTranslateInstance(x, y); 
at = AffineTransform.getScaleInstance(zoom, zoom); 

at.translate(x, y); 
at.scale(zoom, zoom);  

//Create affine transformation 
AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 

//Apply transformation 
BufferedImage img2 = op.filter(img, null); 

//Draw image 
g2d.drawImage(img2, 0, 0, this); 

残念ながら、このアプローチは、ズーム操作には不適切です。それはより計算的に高価である。ラスタデータ(JPG、5000 X 7000 PIX)

AffineTransformOp op = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 

は約1.5秒かかり、単純な双線形補間のために...逆に、スケーリングGraphics2Dオブジェクトを使用して大幅に高速(< 0.1秒)であり、画像であることができますリアルタイムでシフトされ、ズームされる。私の意見で

、ラスタデータと一緒にオブジェクトを再スケーリングすると、Graphics2Dオブジェクトを再スケーリングするよりも遅くなります....