I recently saw this question on how to rotate an image in Java. I copy/pasted it directly from that answer. On implementation, it seems to only rotate images that are squares(that is have the same size, width and height). When I try to use it for a non-square image, it seems to cut off that part that would make it be a rectangle, if that makes sense. Like this

How can I fix/work around this? 
Edit: The code I'm using. Also, I won't have a scroll bar as this will be a "game", and also won't be in full screen all of the time.
public class Player extends Entity { //Entity has basic values such as (float) x & y values, along with some getters and setters
   double theta;    
   Reticle reticle; //draws a reticle where the cursor was(basically just replaces java.awt.Cursor due to something not neccessary for me to get into)
   Sprite currentImage; //basically just a BufferedImage that you can apply aspect ratios to
   //constructor
   @Override
   public void tick() {
      //(this line) gets the Reticle from the main-method class and set it to this reticle object
      reticleX = reticle.getX(); //basically gets the mouse coordinates
      reticleY = reticle.getY();
      x += dX; //delta or change in X
      y += dY  //delta or change in Y
      checkCollision(); //bounds checking
      //getCentralizedX()/Y() gets the center of the currentImage
      theta = getAngle(getCentralizedX(), getCentralizedY(), reticleX, reticleY);
      currentImage = Images.rotateSprite(currentImage, theta);
    }
    @Override
    public void render(Graphics g) {
        currentImage.render(g, x, y);
        g.drawLine((int) getCentralizedX(), (int) getCentralizedY(), (int) reticleX, (int) reticleY);
    }
    public double getAngle(float startX, float startY, float goalX, float goalY) {
        double angle = Math.atan2(goalY - startY, goalX - startX);
        //if(angle < 0) { //removed this as this was the thing messing up the rotation
            //angle += 360;
        //}
    }
 If the angle of the soldier is from 90 < angle < 270, then it is (basically), however, if its its 90 > angle > 270, then it gets a little wonky. Here are some pictures. It is not the angle of the aim-line(the blue line) that is wrong. 
Removed all of the images as removing the if(angle < 0) inside of getAngle() fixed the rotation bug. Now the only problem is that it doesn't rotate in place.
EDIT 2: My SSCCE, which uses the same method as my game, but freaks out for some reason.
public class RotateEx extends Canvas implements Runnable {
Player player;
public RotateEx(BufferedImage image) {
    player = new Player(image, 50, 50);
    setPreferredSize(new Dimension(600, 600));
}
public void setDegrees(int degrees) {
    player.theta = Math.toRadians(degrees);
}
public BufferedImage rotateImage(BufferedImage original, double theta) {
    double cos = Math.abs(Math.cos(theta));
    double sin = Math.abs(Math.sin(theta));
    double width = original.getWidth();
    double height = original.getHeight();
    int w = (int) (width * cos + height * sin);
    int h = (int) (width * sin + height * cos);
    BufferedImage out = new BufferedImage(w, h, original.getType());
    Graphics2D g2 = out.createGraphics();
    double x = w / 2; //the middle of the two new values 
    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(original, at);
    g2.dispose();
    return out;
}
public void tick() {
    player.tick();
}
public void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if(bs == null) {
        createBufferStrategy(4);
        return;
    }
    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, getWidth(), getHeight());
    player.render(g);
    g.dispose();
    bs.show();
}
public static void main(String args[]) throws IOException, InterruptedException {
    String loc = "FILELOCATION"; //of course this would be a valid image file
    BufferedImage image = ImageIO.read(new File(loc));
    final RotateEx ex = new RotateEx(image);
    final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 360, 0);
    slider.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            int value = slider.getValue();
            ex.setDegrees(value);
        }
    });
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(ex);
    f.add(slider, BorderLayout.SOUTH);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    new Thread(ex).start();
}
@Override
public void run() {
    long lastTime = System.nanoTime();
    final double numTicks = 60.0;
    double n = 1000000000 / numTicks;
    double delta = 0;
    int frames = 0;
    int ticks = 0;
    long timer = System.currentTimeMillis();
    while (true) {
        long currentTime = System.nanoTime();
        delta += (currentTime - lastTime) / n;
        lastTime = currentTime;
        render();
        tick();
        frames++;
        if (delta >= 1) {
            ticks++;
            delta--;
        }
    }
}
class Player {
    public float x, y;
    int width, height;
    public double theta; //how much to rotate, in radians
    BufferedImage currentImage; //this image would change, according to the animation and what frame its on
    public Player(BufferedImage image, float x, float y) {
        this.x = x;
        this.y = y;
        width = image.getWidth();
        height = image.getHeight();
        currentImage = image;
    }
    public void tick() {
        currentImage = rotateImage(currentImage, theta);
    }
    public void render(Graphics g) {
        g.drawImage(currentImage, (int) x, (int) y, null);
    }
}
}
 
     
     
    