首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BufferedImage在旋转后被截断

BufferedImage在旋转后被截断
EN

Stack Overflow用户
提问于 2015-11-29 01:13:04
回答 1查看 379关注 0票数 1

我的代码每次“更新”都会将图像旋转0.4度,图像在-10,+10范围内连续旋转。问题是,当它旋转时,缓冲的图像在边缘被切断,似乎旋转改变了bufferedImage需要的大小,但大小永远不会更新,你知道如何让它工作吗?

代码语言:javascript
运行
复制
    protected double rotation = 0;
    private   double rotDir = 0.4;

    private BufferedImage getRotatedSprite(){
        if(Math.abs(rotation)>10)
            rotDir=rotDir*(-1);
        rotation+=rotDir;
        ImageIcon icon = new ImageIcon(bImage);
        BufferedImage bImg = new BufferedImage(icon.getIconWidth(), 
                   icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d= (Graphics2D)bImg.getGraphics();
        g2d.rotate(Math.toRadians(rotation), icon.getIconWidth()/2, icon.getIconHeight()/2);
        g2d.drawImage(bImage, 0, 0, null);
        return bImg;
}
   public void drawSprite(Graphics g) { 
        BufferedImage image = getRotatedSprite();

        if(customWidth != -1 && customHeight != -1){
            g.drawImage(image, (int)locX, (int)locY, customWidth, customHeight, this);
    }else
        g.drawImage(image, (int)locX, (int)locY, this);
}
EN

回答 1

Stack Overflow用户

发布于 2015-11-29 01:23:20

看起来像是旋转改变了bufferedImage的大小

是的,尺寸会随着旋转角度的不同而变化。

您可能会发现使用Rotated Icon更容易。它会为您执行旋转并重新计算大小(如果需要)。不需要创建新的BufferedImages,您只需设置旋转度。

简单的例子。使用slilder栏旋转图标:

代码语言:javascript
运行
复制
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;

public class Rotation3 extends JPanel
{
    private Icon icon;
    private RotatedIcon rotated;
    private int degrees;

    public Rotation3(Image image)
    {
        icon = new ImageIcon( image );
        rotated = new RotatedIcon(icon, 0);
//      rotated.setCircularIcon( true );
        setDegrees( 0 );
        setPreferredSize( new Dimension(600, 600) );
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        // translate x/y so Icon rotated around a specific point (300, 300)

        int x = 300 - (rotated.getIconWidth() / 2);
        int y = 300 - (rotated.getIconHeight() / 2);
        rotated.paintIcon(this, g, x, y);

        g.setColor(Color.RED);
        g.fillOval(295, 295, 10, 10);
    }

    public void setDegrees(int degrees)
    {
        this.degrees = degrees;
        rotated.setDegrees(degrees);
        repaint();
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
//                  String path = "dukewavered.gif";
                    String path = "lunch75.jpg";
                    BufferedImage bi = ImageIO.read(Rotation3.class.getResourceAsStream(path));
                    final Rotation3 r = new Rotation3(bi);

                    final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 360, 0);
                    slider.addChangeListener(new ChangeListener()
                    {
                        public void stateChanged(ChangeEvent e)
                        {
                            int value = slider.getValue();
                            r.setDegrees( value );
                        }
                    });

                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.add(new JScrollPane(r));
                    f.add(slider, BorderLayout.SOUTH);
                    f.pack();
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
                }
                catch(IOException e)
                {
                    System.out.println(e);
                }
            }
        });
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33974090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档