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 
