java – 使用Graphics2D使用子像素级精度绘制图像

前端之家收集整理的这篇文章主要介绍了java – 使用Graphics2D使用子像素级精度绘制图像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正试图以正常速度在屏幕上绘制图像,就像在视频游戏中一样.

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

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

最初这是我做的:

  1. BufferedImage srcImage = sprite.getImage ( );
  2. Position imagePosition = ... ; //Defined elsewhere
  3. g.drawImage ( srcImage,(int) imagePosition.getX(),(int) imagePosition.getY() );

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

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

  1. g.setRenderingHint ( RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON );
  2.  
  3. BufferedImage srcImage = sprite.getImage ( );
  4.  
  5. g.setPaint ( new TexturePaint ( srcImage,new Rectangle2D.Float ( 0,srcImage.getWidth ( ),srcImage.getHeight ( ) ) ) );
  6.  
  7. AffineTransform xform = new AffineTransform ( );
  8.  
  9. xform.setToIdentity ( );
  10. xform.translate ( onScreenPos.getX ( ),onScreenPos.getY ( ) );
  11. g.transform ( xform );
  12.  
  13. g.fillRect(0,srcImage.getWidth(),srcImage.getHeight());

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

解决方法

您可以使用BufferedImage和AffineTransform,绘制到缓冲的图像,然后将缓冲的图像绘制到paint事件中的组件.
  1. /* overrides the paint method */
  2. @Override
  3. public void paint(Graphics g) {
  4. /* clear scene buffer */
  5. g2d.clearRect(0,(int)width,(int)height);
  6.  
  7. /* draw ball image to the memory image with transformed x/y double values */
  8. AffineTransform t = new AffineTransform();
  9. t.translate(ball.x,ball.y); // x/y set here,ball.x/y = double,ie: 10.33
  10. t.scale(1,1); // scale = 1
  11. g2d.drawImage(image,t,null);
  12.  
  13. // draw the scene (double percision image) to the ui component
  14. g.drawImage(scene,this);
  15. }

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

猜你在找的Java相关文章