使用Graphics2D使用亚像素级精度绘制图像

Kau*_*kar 7 java graphics image graphics2d subpixel

我目前正试图以正常速度在屏幕上绘制图像,就像在视频游戏中一样.

不幸的是,由于图像移动的速率,一些帧是相同的,因为图像尚未移动整个像素.

有没有办法为floatGraphics2D 提供值,以便在屏幕上绘制图像而不是int值?

最初这是我做的:

BufferedImage srcImage = sprite.getImage ( );
Position imagePosition = ... ; //Defined elsewhere
g.drawImage ( srcImage, (int) imagePosition.getX(), (int) imagePosition.getY() );
Run Code Online (Sandbox Code Playgroud)

这当然是阈值,因此图片不会在像素之间移动,而是从一个跳到下一个.

下一个方法是将绘制颜色设置为纹理,然后在指定位置绘制.不幸的是,这产生了不正确的结果,显示出平铺而不是正确的抗锯齿.

g.setRenderingHint ( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );

BufferedImage srcImage = sprite.getImage ( );

g.setPaint ( new TexturePaint ( srcImage, new Rectangle2D.Float ( 0, 0, srcImage.getWidth ( ), srcImage.getHeight ( ) ) ) );

AffineTransform xform = new AffineTransform ( );

xform.setToIdentity ( );
xform.translate ( onScreenPos.getX ( ), onScreenPos.getY ( ) );
g.transform ( xform );

g.fillRect(0, 0, srcImage.getWidth(), srcImage.getHeight());
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能在Java中实现图像子像素渲染的预期效果?

L42*_*22Y 8

您可以使用a BufferedImageAffineTransform绘制到缓冲的图像,然后将缓冲的图像绘制到paint事件中的组件.

    /* overrides the paint method */
    @Override
    public void paint(Graphics g) {
        /* clear scene buffer */
        g2d.clearRect(0, 0, (int)width, (int)height);

        /* draw ball image to the memory image with transformed x/y double values */
        AffineTransform t = new AffineTransform();
        t.translate(ball.x, ball.y); // x/y set here, ball.x/y = double, ie: 10.33
        t.scale(1, 1); // scale = 1 
        g2d.drawImage(image, t, null);

        // draw the scene (double percision image) to the ui component
        g.drawImage(scene, 0, 0, this);
    }
Run Code Online (Sandbox Code Playgroud)

在这里查看我的完整示例:http://pastebin.com/hSAkYWqM