2011-01-16 14 views
29

ich den folgenden Code verwenden einige Manipulationen auf dem Bild auszuführen, die ich geladen, aber ich finde, dass das Display verschwommen wird, wenn es auf dem Retina-Display istCore Graphics für Retina-Display

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

Wie kann ich ändern Dies macht es zu Netzhaut kompatibel.

Vielen Dank im Voraus für Ihre Hilfe

Best, DV

Antwort

47

CGImages berücksichtigen nicht die Retina-ness des Geräts, so dass Sie sich so zu tun haben.

Dazu müssen Sie alle Ihre Koordinaten und Größen, die in CoreGraphics-Routinen verwendet werden, mit der Eigenschaft scale (die bei Retina-Geräten 2.0 ist) multiplizieren, um sicherzustellen, dass Sie alle Ihre Manipulationen mit doppelter Auflösung durchführen.

Dann müssen Sie die Initialisierung von resultImage ändern, um initWithCGImage:scale:orientation: zu verwenden und denselben Skalierungsfaktor einzugeben. Dies macht die Retina-Geräte dazu, die Ausgabe mit nativer Auflösung und nicht mit pixelverdoppelter Auflösung zu rendern.

+0

Dank! Diese Methode hat mein Problem gelöst !! – DKV

+1

Wenn Sie die CTM (aktuelle Transformationsmatrix) Ihres Kontexts ändern, indem Sie 'CGContextScaleCTM (UIGraphicsGetCurrentContext(), 2, 2)' aufrufen, müssen Sie Ihre Koordinaten nicht manuell multiplizieren, sondern können genauso zeichnen wie Sie Nicht-Retina-Bilder. – epologee

+14

Sorry, war zu schnell mit dem Kommentar und zu spät für den Schnitt. Wenn Sie es so machen, müssen Sie nicht alle Koordinaten selbst skalieren: 'CGFloat scale = [[UIScreen mainScreen] scale]; CGContextScaleCTM (UIGraphicsGetCurrentContext(), scale, scale); ' – epologee

5

Danke für die Antwort, hat mir geholfen! Wie auch immer klarer zu sein, sollte der Code von OP wie folgt geändert werden:

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

Swift Version:

let scale = UIScreen.mainScreen().scale 

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale)