2016-12-04 127 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(在); 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对象慢....