2011-04-27 19 views
5

Estoy tratando de cambiar el tamaño de un CGImageRef para que pueda dibujarlo en la pantalla con el tamaño que quiero. así que tengo este código:Cambiar el tamaño de la imagen en Core Graphics

CGColorSpaceRef colorspace = CGImageGetColorSpace(originalImage); 

CGContextRef context = CGBitmapContextCreate(NULL, 
              CGImageGetWidth(originalImage), 
              CGImageGetHeight(originalImage), 
              CGImageGetBitsPerComponent(originalImage), 
              CGImageGetBytesPerRow(originalImage), 
              colorspace, 
              CGImageGetAlphaInfo(originalImage)); 

if(context == NULL) 
    return nil; 

CGRect clippedRect = CGRectMake(CGContextGetClipBoundingBox(context).origin.x, 
           CGContextGetClipBoundingBox(context).origin.y, 
           toWidth, 
           toHeight); 
CGContextClipToRect(context, clippedRect); 

// draw image to context 
CGContextDrawImage(context, clippedRect, originalImage); 

// extract resulting image from context 
CGImageRef imgRef = CGBitmapContextCreateImage(context); 

lo que este código permite que dibuje al parecer, la imagen al tamaño que quiero, y eso es bueno. El problema es que la imagen real que obtengo una vez cambia de tamaño a pesar de que parece redimensionada en la pantalla, no se cambia de tamaño. Cuando lo hago:

CGImageGetWidth (imgRef);

En realidad devuelve el ancho original de la imagen y no el ancho que veo en la pantalla.

Entonces, ¿cómo puedo crear una imagen que realmente se redimensione y no solo dibuje el tamaño correcto que quiero?

Gracias

+1

¿Solo desea * dibujar * se redimensionó o realmente * quiere * cambiarle el tamaño? Puedes hacer lo primero sin hacer lo segundo (y probablemente sea aún más rápido) – Robin

Respuesta

4

La cuestión es que va a crear el contexto con el mismo tamaño que la imagen. Desea que el contexto sea el nuevo tamaño. Y luego el recorte es innecesario.

Prueba esto:

CGColorSpaceRef colorspace = CGImageGetColorSpace(originalImage); 

CGContextRef context = CGBitmapContextCreate(NULL, 
              toWidth, // Changed this 
              toHeight, // Changed this 
              CGImageGetBitsPerComponent(originalImage), 
              CGImageGetBytesPerRow(originalImage)/CGImageGetWidth(originalImage)*toWidth, // Changed this 
              colorspace, 
              CGImageGetAlphaInfo(originalImage)); 

if(context == NULL) 
    return nil; 

// Removed clipping code 

// draw image to context 
CGContextDrawImage(context, CGContextGetClipBoundingBox(context), originalImage); 

// extract resulting image from context 
CGImageRef imgRef = CGBitmapContextCreateImage(context); 

que en realidad no lo prueba, pero debería al menos le dará la idea de lo que hay que cambiar.

+0

Ya que estamos en el tema, voy a hacer un complemento para mis categorías de UIImage, [CKImageAdditions] (https://github.com/cmkilger/ CKImageAdditions /). Puede usar -imageWithSize: contentMode :. –

Cuestiones relacionadas