簡體   English   中英

旋轉BufferedImage顯示黑色邊界

[英]Rotate BufferedImage shows black bound


我想旋轉一個bufferedImage。 我使用的代碼使圖像旋轉成為可能。 但這會將圖像切成正方形。 屏幕然后在左側和右側顯示一個黑色的“邊框”。
如果使用調試工具,則圖像寬度約為包括黑色“邊框”在內的整個寬度。 但是黑色的“邊框”不旋轉,始終在左側和右側。 並且圖像缺少左右兩邊的圖片部分。 如果再次旋轉正方形圖像,則不會再次剪切。 如果更改src.getWidth()-部分,則每次旋轉圖像都會變小。

  private static BufferedImage rotateImage(BufferedImage src, double degrees) {
      AffineTransform affineTransform = AffineTransform.getRotateInstance(
        Math.toRadians(degrees), (src.getWidth() / 2), (src.getHeight() / 2));

      BufferedImage rotatedImage = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());
      Graphics2D g = (Graphics2D) rotatedImage.getGraphics();
      g.setTransform(affineTransform);
      g.drawImage(src, 0, 0, null);
      return rotatedImage;
  }

  public void rotateImage(int degree) {
     if (this.image != null) {
         this.setImage(myJComponent.rotateImage(this.image, degree));
     }
  } 

圖像的尺寸將隨着旋轉而改變。

這是一些可玩的代碼:

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 Rotation
{
    BufferedImage image;
    JLabel label;

    public Rotation(BufferedImage image)
    {
        this.image = image;
    }

    private BufferedImage getImage(double theta)
    {
        //  Determine the size of the rotated image

        double cos = Math.abs(Math.cos(theta));
        double sin = Math.abs(Math.sin(theta));
        double width  = image.getWidth();
        double height = image.getHeight();
        int w = (int)(width * cos + height * sin);
        int h = (int)(width * sin + height * cos);

        //  Rotate and paint the original image onto a BufferedImage

        BufferedImage out = new BufferedImage(w, h, image.getType());
        Graphics2D g2 = out.createGraphics();
        g2.setPaint(UIManager.getColor("Panel.background"));
        g2.fillRect(0,0,w,h);
        double x = w/2;
        double y = h/2;
        AffineTransform at = AffineTransform.getRotateInstance(theta, x, y);
        x = (w - width)/2;
        y = (h - height)/2;
        at.translate(x, y);
        g2.drawRenderedImage(image, at);
        g2.dispose();
        return out;
    }

    private JLabel getLabel()
    {
        ImageIcon icon = new ImageIcon(image);
        label = new JLabel(icon);
        label.setHorizontalAlignment(JLabel.CENTER);
        return label;
    }

    private JSlider getSlider()
    {
        final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 360, 0);
        slider.addChangeListener(new ChangeListener()
        {
            public void stateChanged(ChangeEvent e)
            {
                int value = slider.getValue();
                BufferedImage bi = getImage(Math.toRadians(value));
                label.setIcon(new ImageIcon(bi));
            }
        });
        return slider;
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    String path = "mong.jpg";
                    ClassLoader cl = Rotation.class.getClassLoader();
                    BufferedImage bi = ImageIO.read(cl.getResourceAsStream(path));
                    Rotation r = new Rotation(bi);
                    JFrame f = new JFrame();
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.getContentPane().add(new JScrollPane(r.getLabel()));
                    f.getContentPane().add(r.getSlider(), "South");
                    f.pack();
                    f.setLocation(200,200);
                    f.setVisible(true);
                }
                catch(IOException e)
                {
                    System.out.println(e);
                }
            }
        });
    }
}

只需更改要讀取的圖像,然后使用滑塊旋轉圖像即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM