2010-06-30 13 views
19

Utilizo el siguiente código para obtener imágenes del sprite. Y funciona bien en todas partes excepto en el iPhone 4 (versión HD).¿Cómo se usa CGImageCreateWithImageInRect para iPhone 4 (HD)?

- (UIImage *)croppedImage:(CGRect)rect { 
    CGImageRef image = CGImageCreateWithImageInRect([self CGImage], rect); 
    UIImage *result = [UIImage imageWithCGImage:image]; 
    CGImageRelease(image); 
    return result; 
} 

El iPhone 4 se cargan automáticamente la versión HD de la imagen ([email protected]) en lugar sprite.png. La imagen original tiene una escala 2, pero la imagen resultante tiene una escala 1 y un tamaño incorrecto.

¿Cómo manejar este comportamiento teniendo en cuenta las diferentes escalas para iPhone 3G [s] y iPhone 4?

He leído esto document, pero sobre el uso CGImageCreateWithImageInRect aquí no dice nada.

+0

Estaría muy interesado si pudiera ver mi respuesta. Estoy seguro de que hay una mejor manera de lograr lo que queremos. Pero la respuesta correcta aquí me parece no ir al grano. ¿Podría usar el código anterior + la traducción rect con escala y ver si funciona? – Daniel

Respuesta

32

Por lo que puedo decir, CGImageCreateWithImageInRect hará lo correcto. Lo que hay que cambiar es el UIImage initilization

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/occ/clm/UIImage/imageWithCGImage:scale:orientation:

cambiarlo a [UIImage imageWithCGImage:image scale:self.scale orientation:self. imageOrientation] y debería funcionar bien. (esto es asumiendo que esta es una categoría en UIImage que parece que es)

+3

Gracias. Me perdí esta función. Además, necesito multiplicar la imagen de la fuente rect por self.scale. – Victor

+2

Gracias. Esto me ahorró horas :-) También: necesitaba multiplicar el factor de escala a las dimensiones de mi cultivo para que el resultado se vea correctamente. – esbenr

+1

Sí, la multiplicación del rect parece ser una extraña solución para algo que simplemente debería "hacer lo correcto". La clave es la escala, no este método mencionado en la respuesta. – Daniel

14

Debe multiplicar el recorte de corte por la escala de la imagen. Desde mi experiencia, no es necesario utilizar ninguna iniciación de imagen diferente.

- (UIImage *)_cropImage:(UIImage *)image withRect:(CGRect)cropRect 
{ 
    cropRect = CGRectMake(cropRect.origin.x * image.scale, 
          cropRect.origin.y * image.scale, 
          cropRect.size.width * image.scale, 
          cropRect.size.height * image.scale); 

    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect); 

    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 

    CGImageRelease(imageRef); 

    return croppedImage; 
} 
+0

Me parece que esto funciona y lo anterior no. Probablemente Apple cambie las implementaciones ... –

+0

No funciona a partir de septiembre de 2016 – joey