Problema ao girar e ampliar imagem (AffineTransform)

Olá,

Eu estou tentando escrever um código para girar (rotacionar) uma imagem e logo depois ampliá-la. Consultei alguns tutoriais e o código que escrevi está abaixo. Mas o código não está funcionando porque a imagem girada não está sendo posicionada no centro da figura - quando o angulo de girar é de 90 ou 270 graus, a imagem fica deslocada. Quando o ângulo é de 180 graus, a imagem fica correta. Já experimentei várias possibilidades, e procurei na Web, mas os tutoriais que encontrei não dão muitas explicações sobre rotate() e scale().

Alguém poderia me ajudar?

Obrigado,

Hel_all

	public void processarImagem() {
		
		if (semAlteracao)
			imagemMostrada =  imagemOriginal; 
		
		else {
			//fator de zoom - o zoom eh um valor inteiro entre 20 e 150
			double fator = zoom.getValor() / 100.0;

			//novas dimensoes da imagem
			int width = imagemOriginal.getImage().getWidth(null);
			int heigth = imagemOriginal.getImage().getHeight(null); 
	
			int novoWidth = (int) (width * fator); 
			int novoHeigth = (int) (heigth * fator);
			
			//rotacionar pode assumir os valores 0, 90, 180 ou 270
			if (rotacionar.getValor() == 90 || rotacionar.getValor() == 270) {
				int temp = novoWidth;
				novoWidth = novoHeigth; 
				novoHeigth = temp; 
			}
			
			//imagem para cópia
			BufferedImage img = new BufferedImage(novoWidth, novoHeigth, 
					BufferedImage.TYPE_INT_RGB); 
			
			//grafico para imagem
			Graphics2D g = img.createGraphics(); 
			
			//configuracoes do grafico
			g.setRenderingHint(RenderingHints.KEY_RENDERING, 
					RenderingHints.VALUE_RENDER_QUALITY); 
			g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
					RenderingHints.VALUE_ANTIALIAS_ON); 
			g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
					RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
			
					
			//tranformacoes do grafico
			AffineTransform af = null;
			
			if (rotacionar.getValor() != 0) {
				if (af == null)
					af = new AffineTransform(); 
				af.rotate(Math.toRadians(rotacionar.getValor()), 
						img.getWidth()/2, img.getHeight()/2);
			}

			if (zoom.getValor() != 100) {
				if (af == null)
					af = new AffineTransform(); 
				af.scale(fator, fator);
			}
				
			//imprime a imagem
			if (!g.drawImage(imagemOriginal.getImage(), af, null))
				JOptionPane.showMessageDialog(null, "Imagem não foi convertida corretamente!");
			
			//fecha o grafico
			g.dispose(); 
			
                        //guarda o resultado
			imagemMostrada = new ImageIcon(img);
		
		}
		 
	}