objective framework developer apple iphone core-graphics retina-display cg

iphone - framework - CoreGraphics para retina.



swift ios documentation (3)

Estoy usando el siguiente código para realizar algunas manipulaciones en la imagen que cargué, pero encuentro que la pantalla se vuelve borrosa cuando está en la pantalla de la retina

- (UIImage*)createImageSection:(UIImage*)image section:(CGRect)section { float originalWidth = image.size.width ; float originalHeight = image.size.height ; int w = originalWidth * section.size.width; int h = originalHeight * section.size.height; CGContextRef ctx = CGBitmapContextCreate(nil, w, h, 8, w * 8,CGImageGetColorSpace([image CGImage]), kCGImageAlphaPremultipliedLast); CGContextClearRect(ctx, CGRectMake(0, 0, originalWidth * section.size.width, originalHeight * section.size.height)); // w + h before CGContextTranslateCTM(ctx, (float)-originalWidth * section.origin.x, (float)-originalHeight * section.origin.y); CGContextDrawImage(ctx, CGRectMake(0, 0, originalWidth, originalHeight), [image CGImage]); CGImageRef cgImage = CGBitmapContextCreateImage(ctx); UIImage* resultImage = [[UIImage alloc] initWithCGImage:cgImage]; CGContextRelease(ctx); CGImageRelease(cgImage); return resultImage; }

¿Cómo cambio esto para que sea compatible con la retina?

Gracias de antemano por tu ayuda

Mejor, dv


CGImages no tiene en cuenta la Retención de su dispositivo, por lo que debe hacerlo usted mismo.

Para hacer eso, debe multiplicar todas sus coordenadas y tamaños que se usan en las rutinas CoreGraphics por la propiedad de scale la imagen de entrada (que será 2.0 en dispositivos Retina), para asegurarse de realizar toda la manipulación a doble resolución.

Luego debe cambiar la inicialización de resultImage para usar initWithCGImage:scale:orientation: e ingresar el mismo factor de escala. Esto es lo que hace que los dispositivos Retina representen la salida en resolución nativa en lugar de resolución de doble píxel.


Gracias por la respuesta, me ayudó! De todos modos, para ser más claros, el código de OP debe cambiarse así:

- (UIImage*)createImageSection:(UIImage*)image section:(CGRect)section { CGFloat scale = [[UIScreen mainScreen] scale]; ////// ADD float originalWidth = image.size.width ; float originalHeight = image.size.height ; int w = originalWidth * section.size.width *scale; ////// CHANGE int h = originalHeight * section.size.height *scale; ////// CHANGE CGContextRef ctx = CGBitmapContextCreate(nil, w, h, 8, w * 8,CGImageGetColorSpace([image CGImage]), kCGImageAlphaPremultipliedLast); CGContextClearRect(ctx, CGRectMake(0, 0, originalWidth * section.size.width, originalHeight * section.size.height)); // w + h before CGContextTranslateCTM(ctx, (float)-originalWidth * section.origin.x, (float)-originalHeight * section.origin.y); CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale); ////// ADD CGContextDrawImage(ctx, CGRectMake(0, 0, originalWidth, originalHeight), [image CGImage]); CGImageRef cgImage = CGBitmapContextCreateImage(ctx); UIImage* resultImage = [[UIImage alloc] initWithCGImage:cgImage]; CGContextRelease(ctx); CGImageRelease(cgImage); return resultImage; }


Versión rápida:

let scale = UIScreen.mainScreen().scale CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale)