2012-03-30 3 views
2

J'ai ce code, qui crée une image, puis ajoute quelques effets et le réduit à largeThumbnail.UIImageJPEGRepresentation donnant 2x images sur l'affichage de la rétine

UIImage *originalImage = [UIImage imageWithData:self.originalImage]; 
thumbnail = createLargeThumbnailFromImage(originalImage); 

NSLog(@"thumbnail: %f", thumbnail.size.height); 
NSData *thumbnailData = UIImageJPEGRepresentation(thumbnail, 1.0); 

Plus tard:

UIImage *image = [UIImage imageWithData:self.largeThumbnail]; 
NSLog(@"thumbnail 2: %f", image.size.height); 

NSLog retourne:

thumbnail: 289.000000 
thumbnail 2: 578.000000 

Comme vous pouvez le voir, quand il convertit l'image en arrière à partir de données, il fait 2x la taille. Des idées pour lesquelles cela pourrait se produire?

Grand code miniature:

UIImage *createLargeThumbnailFromImage(UIImage *image) { 
    UIImage *resizedImage; 

     resizedImage = [image imageScaledToFitSize:LARGE_THUMBNAIL_SIZE]; 

    CGRect largeThumbnailRect = CGRectMake(0, 0, resizedImage.size.width, resizedImage.size.height); 

    UIGraphicsBeginImageContextWithOptions(resizedImage.size, NO, 0); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    //Image 
    CGContextTranslateCTM(context, 0, resizedImage.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextDrawImage(context, largeThumbnailRect, resizedImage.CGImage); 

    //Border 
    CGContextSaveGState(context); 
    CGRect innerRect = rectForRectWithInset(largeThumbnailRect, 1.5); 
    CGMutablePathRef borderPath = createRoundedRectForRect(innerRect, 0); 
    CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] CGColor]); 
    CGContextSetLineWidth(context, 3); 
    CGContextAddPath(context, borderPath); 
    CGContextStrokePath(context); 
    CGContextRestoreGState(context); 

    UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return thumbnail; 
} 
+0

Est-ce que vous avez des idées pour expliquer pourquoi cela se produit? Qu'avez-vous essayé de déboguer vous-même? –

+0

J'ai ajouté des NSLogs supplémentaires, qui ont révélé que cela se produisait au point où l'image est reconvertie à partir de NSData. – Andrew

Répondre

6

Essayez de remplacer la partie où vous chargez la seconde image:

UIImage *image = [UIImage imageWithData:self.largeThumbnail]; 

avec celui-ci:

UIImage *jpegImage = [UIImage imageWithData:self.largeThumbnail]; 
UIImage *image = [UIImage imageWithCGImage:jpegImage.CGImage scale:originalImage.scale orientation:jpegImage.imageOrientation]; 

Qu'est-ce qui se passe ici est que la l'échelle d'image n'est pas définie, vous obtenez donc des dimensions d'image doubles.

+0

J'ai le même problème (obtenir 2x image lors de la conversion de NSData *). Pourriez-vous élaborer plus? Pour moi, 'originalImage.scale' renvoie 1 donc cette solution ne fonctionne pas pour moi. – mostruash

+0

"échelle n'est pas définie, donc vous obtenez des dimensions d'image double." .. Cette ligne m'aide ... Merci .. – IKKA

+0

Je passais "0" comme une échelle à UIGraphicsBeginImageContextWithOptions pour créer une image mise à l'échelle. Passer originalImage.scale l'a corrigé. Merci!! – PaulG

Questions connexes