30 votes

CoreGraphics pour l'affichage de la rétine

J'utilise le code suivant pour effectuer quelques manipulations sur l'image que j'ai chargée, mais je constate que l'affichage devient flou lorsqu'il s'agit de l'écran rétina.

- (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;
}

Comment puis-je changer cela pour le rendre compatible avec la rétine.

Merci d'avance pour votre aide

Le meilleur, DV

48voto

grahamparks Points 10187

CGImages ne prend pas en compte le caractère Retina de votre appareil, vous devez donc le faire vous-même.

Pour ce faire, vous devez multiplier toutes les coordonnées et tailles utilisées dans les routines CoreGraphics par la valeur de l'image d'entrée. scale (qui sera 2.0 sur les appareils Retina), afin de vous assurer que vous effectuez toutes vos manipulations en double résolution.

Vous devez alors modifier l'initialisation de resultImage à utiliser initWithCGImage:scale:orientation: et introduire le même facteur d'échelle. C'est ce qui fait que les appareils Retina rendent la sortie à la résolution native plutôt qu'à une résolution doublée en pixels.

5voto

Rocotilos Points 2341

Merci pour la réponse, cela m'a aidé ! Quoi qu'il en soit, pour être plus clair, le code de l'OP devrait être modifié comme suit :

- (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;
}

2voto

ioopl Points 1377

Version Swift :

    let scale = UIScreen.mainScreen().scale

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X