Estoy usando el siguiente código para realizar algún tipo de manipulación en la imagen que se me cargan, pero me parece 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 puedo cambiar esto para hacer compatibles con la pantalla retina.

Gracias de antemano por su ayuda

Mejor,
DV

InformationsquelleAutor DKV | 2011-01-16

3 Comentarios

  1. 48

    CGImages no tomar en cuenta la Retina-dad de su dispositivo, así que usted tiene que hacerlo usted mismo.

    Para hacer eso, usted necesita para multiplicar todas sus coordenadas y tamaños que se utilizan en CoreGraphics rutinas de la imagen de entrada del scale de la propiedad (que será de 2.0 en la Retina de los dispositivos), para asegurar que usted hace todos los de su manipulación al doble de resolución.

    Entonces usted necesita para cambiar la inicialización de resultImage utilizar initWithCGImage:scale:orientation: y de entrada el mismo factor de escala. Esto es lo que hace que la Retina de los dispositivos de procesamiento de la salida en la resolución nativa en lugar de píxeles de resolución doblada.

    • Gracias! Este método de resolver mi problema!!
    • Si cambia la marca comunitaria (actual transformación de la matriz) de su contexto llamando CGContextScaleCTM(UIGraphicsGetCurrentContext(), 2, 2), usted no necesita manualmente multiplicar sus coordenadas, se puede hacer lo mismo que haría con los no-retina las imágenes.
    • Lo siento, era demasiado rápido con el comentario y demasiado tarde para la edición. Si se hace así, usted no necesita pensar de la ampliación de todas las coordenadas a ti mismo: CGFloat scale = [[UIScreen mainScreen] scale]; CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale);
    • Así que mucho de sí. Gran solución.
    • Todavía tiene que corregir manualmente la escala si se dibuja sólo una porción (una sub rect) dentro de la imagen.
  2. 5

    Gracias por la respuesta, me ha ayudado! De todas formas para ser más claro, el código de OP debe ser cambiado como este:

    - (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;
    }
  3. 2

    Swift versión :

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

Dejar respuesta

Please enter your comment!
Please enter your name here