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)