Bueno, creo que he conseguido lo de la imagen que gira respecto a un eje (en este caso, la esquina superior izquierda), es utilizando la magia de las matemáticas vectoriales

Aquí el código comentado:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from math import *
def rotar_respecto_esquina(pantalla, ima, pos, angulo, v_x, v_y):
#el punto de origen x, y
x, y = pos
#rotamos la imagen...
ima = pygame.transform.rotate(ima, angulo)
#sacamos el punto central de la imagen, que equivaldrá al origen
#de nuestro espacio vectorial
w = ima.get_width()/2
h = ima.get_height()/2
#rotamos el primer vector de referencia...
vect_1 = rota_vector(v_x,-angulo)
#rotamos el segundo vector de referencia...
vect_2 = rota_vector(v_y,angulo+90)
#y una vez han sido rotados... los sumamos, esta suma es el
#punto donde esta la esquina de nuestra imagen...
vect_suma = (vect_1[0]+vect_2[0],vect_1[1]+vect_2[1])
#el aumento en 'x', y en 'y' es igual sus componentes
au_x = vect_suma[0]
au_y = vect_suma[1]
#finalmente, el lugar donde es colocada la imagen para que paresca
#que gira respecto a su eje...
#restamos w, h, para colocarla al centro, y después, restamos
#el aumento en x, y, para colocarlo en su esquina...
pantalla.blit(ima, (x-w-au_x,y-h-au_y))
#y aquí la posición antes de moverlo...
#pantalla.blit(ima, (x-w,y-h))
#esto dibuja los vectores para que te hagas una idea 
#el primer vector de referencia (verde)
pygame.draw.circle(pantalla,(20,200,20),
(x-int(vect_1[0]),y-int(vect_1[1])),
5)
#el segundo vector de referencia (azul)
pygame.draw.circle(pantalla,(20,20,200),
(x-int(vect_2[0]),y-int(vect_2[1])),
5)
#el vector resultado de la suma de los anteriores
pygame.draw.circle(pantalla,(200,20,20),
(x-int(vect_suma[0]),y-int(vect_suma[1])),
5)
#la función que rota los vectores respecto a un ángulo...
def rota_vector(vector, angulo):
au_x = vector[0]*cos(radians(angulo))-vector[1]*cos(radians(angulo))
au_y = vector[0]*sin(radians(angulo))+vector[1]*sin(radians(angulo))
nuevo = (au_x,au_y)
return nuevo
import pygame, sys
pygame.init()
pantalla = pygame.display.set_mode((500, 500))
pygame.display.set_caption("hola")
imagen_original = pygame.image.load("foto.png").convert_alpha()
imagen = imagen_original
#creo el par de vectores, que al sumarlos
#representan la esquina superior de la imagen
vector_x = [imagen.get_width()/2,0]
vector_y = [0,imagen.get_height()/2]
#animar la rotación y el zoom
angulo = 0
dimencion = 1
dz = 0.1
hacer = True
while hacer:
#fijo un máximo de frames
pygame.time.delay(1000/30)
for eventos in pygame.event.get():
if eventos.type == pygame.QUIT:
hacer = False
if eventos.type == pygame.KEYDOWN:
if eventos.key == pygame.K_F12:
hacer = False
pantalla.fill((100,100,100))
#coloco la imagen que gira con respecto a su esquina en el centro...
rotar_respecto_esquina(pantalla, imagen, (250,250), angulo, vector_x,vector_y)
#aumentamos el ángulo
angulo += 3
#se modifica la dimensión
dimencion += dz
#si la dimensión es mayor a 5 o menor a un medio de la original
if dimencion >= 5 or dimencion <= 0.5:
#invertimos el sentido...
dz = -dz
pygame.display.flip()
pygame.quit()
sys.exit()
Debes verlo funcionar.
Para cambiar la esquina o el punto donde gira, hay que modificar los vectores de referencia, de forma que su suma, sea igual al punto respecto al centro de la imagen, donde quieres que gire
