2013-08-01 2 views
0

Lors du test de mon application pour détecter des bogues, j'ai remarqué que dans le simulateur lorsque j'appelle une de mes fonctions pour définir une image sur un UIImageView, un tas d'erreurs CGContext sont lancées et l'image ne se règle jamais. Cependant sur mes appareils (j'ai testé sur iPhone 5, iPhone 3GS et iPad 3), aucune de ces erreurs CGContext ne se présente et l'image se règle correctement.CGContext Erreurs uniquement dans le simulateur?

Quoi qu'il en soit, je regardai tout code CGContext qui pourrait arriver et les suivantes sont les seules méthodes qui impliquent CGContext:

- (void)setCropRect:(CGRect)cropRect 
{ 
    if(!CGRectEqualToRect(_cropRect,cropRect)){ 
     _cropRect = cropRect; 
     UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.f); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     [[UIColor blackColor] setFill]; 
     UIRectFill(self.bounds); 
     CGContextSetStrokeColorWithColor(context, [[UIColor whiteColor] colorWithAlphaComponent:0.5].CGColor); 
     CGContextStrokeRect(context, _cropRect); 
     [[UIColor clearColor] setFill]; 
     UIRectFill(CGRectInset(_cropRect, 1, 1)); 
     self.imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 
    } 
} 

- (CGImageRef)newScaledImage:(CGImageRef)source withOrientation:(UIImageOrientation)orientation toSize:(CGSize)size withQuality:(CGInterpolationQuality)quality 
{ 
    CGSize srcSize = size; 
    CGFloat rotation = 0.0; 

    switch(orientation) 
    { 
     case UIImageOrientationUp: { 
      rotation = 0; 
     } break; 
     case UIImageOrientationDown: { 
      rotation = M_PI; 
     } break; 
     case UIImageOrientationLeft:{ 
      rotation = M_PI_2; 
      srcSize = CGSizeMake(size.height, size.width); 
     } break; 
     case UIImageOrientationRight: { 
      rotation = -M_PI_2; 
      srcSize = CGSizeMake(size.height, size.width); 
     } break; 
     default: 
      break; 
    } 

    CGContextRef context = CGBitmapContextCreate(NULL, 
               size.width, 
               size.height, 
               8, //CGImageGetBitsPerComponent(source), 
               0, 
               CGImageGetColorSpace(source), 
               kCGImageAlphaNoneSkipFirst//CGImageGetBitmapInfo(source) 
               ); 

    CGContextSetInterpolationQuality(context, quality); 
    CGContextTranslateCTM(context, size.width/2, size.height/2); 
    CGContextRotateCTM(context,rotation); 

    CGContextDrawImage(context, CGRectMake(-srcSize.width/2 , 
              -srcSize.height/2, 
              srcSize.width, 
              srcSize.height), 
         source); 

    CGImageRef resultRef = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 

    return resultRef; 
} 

- (CGImageRef)newTransformedImage:(CGAffineTransform)transform 
         sourceImage:(CGImageRef)sourceImage 
         sourceSize:(CGSize)sourceSize 
       sourceOrientation:(UIImageOrientation)sourceOrientation 
         outputWidth:(CGFloat)outputWidth 
         cropSize:(CGSize)cropSize 
        imageViewSize:(CGSize)imageViewSize 
{ 
    CGImageRef source = [self newScaledImage:sourceImage 
          withOrientation:sourceOrientation 
             toSize:sourceSize 
           withQuality:kCGInterpolationNone]; 

    CGFloat aspect = cropSize.height/cropSize.width; 
    CGSize outputSize = CGSizeMake(outputWidth, outputWidth*aspect); 

    CGContextRef context = CGBitmapContextCreate(NULL, 
               outputSize.width, 
               outputSize.height, 
               CGImageGetBitsPerComponent(source), 
               0, 
               CGImageGetColorSpace(source), 
               CGImageGetBitmapInfo(source)); 
    CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]); 
    CGContextFillRect(context, CGRectMake(0, 0, outputSize.width, outputSize.height)); 

    CGAffineTransform uiCoords = CGAffineTransformMakeScale(outputSize.width/cropSize.width, 
                  outputSize.height/cropSize.height); 
    uiCoords = CGAffineTransformTranslate(uiCoords, cropSize.width/2.0, cropSize.height/2.0); 
    uiCoords = CGAffineTransformScale(uiCoords, 1.0, -1.0); 
    CGContextConcatCTM(context, uiCoords); 

    CGContextConcatCTM(context, transform); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    CGContextDrawImage(context, CGRectMake(-imageViewSize.width/2.0, 
              -imageViewSize.height/2.0, 
              imageViewSize.width, 
              imageViewSize.height) 
         ,source); 

    CGImageRef resultRef = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 
    CGImageRelease(source); 
    return resultRef; 
} 

Ce sont les erreurs CGContext:

Jul 31 23:37:37 app[10190] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 16 bits/pixel; 1-component color space; kCGImageAlphaNoneSkipFirst; 1504 bytes/row. 
Jul 31 23:37:37 app[10190] <Error>: CGContextSetInterpolationQuality: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGContextTranslateCTM: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGContextRotateCTM: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGContextDrawImage: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGBitmapContextCreateImage: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGBitmapContextCreate: unsupported parameter combination: 0 integer bits/component; 0 bits/pixel; 0-component color space; kCGImageAlphaNone; 0 bytes/row. 
Jul 31 23:37:37 app[10190] <Error>: CGContextSetFillColorWithColor: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGContextFillRects: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGContextConcatCTM: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGContextConcatCTM: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGContextScaleCTM: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGContextDrawImage: invalid context 0x0 
Jul 31 23:37:37 app[10190] <Error>: CGBitmapContextCreateImage: invalid context 0x0 

Ce sont les Seules les méthodes de mon application qui utilisent CGContexts. Mais comme je l'ai dit, cela se produit uniquement dans le simulateur et non sur les appareils sur lesquels j'ai testé.

Quoi qu'il en soit, y a-t-il une raison particulière à cela ou y at-il un moyen de résoudre ce problème?

Merci à tous!

CGContextRef context = CGBitmapContextCreate(NULL, 
               size.width, 
               size.height, 
               CGImageGetBitsPerComponent(source), //8, 
               0, 
               CGImageGetColorSpace(source), 
               CGImageGetBitmapInfo //kCGImageAlphaNoneSkipFirst(source) 
               ); 
+1

Il serait utile que vous nous disiez ce que c'était "le tas d'erreurs de CGContext". –

+0

Désolé, je les ai ajoutés. –

Répondre

1

Très probablement, votre premier appel à CGBitmapContextCreate échoue, parce que vous lui demandez de faire quelque chose qu'il ne peut pas faire. Vous pouvez voir que dans le premier message d'erreur:

CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 16 bits/pixel; 1-component color space; kCGImageAlphaNoneSkipFirst; 1504 bytes/row. 

CGBitmapContextCreate retourne NULL, et le reste de la cascade de défaillances à partir de là. (Vous ne pouvez pas fonctionner sur un contexte NULL, et appelant CGBitmapContextGetImage() sur un contexte NULL vous donne une image NULL, que vous pouvez pas non plus faire quelque chose d'utile.)

La documentation pour CGBitmapContextCreate états:

Pour la liste des formats de pixels pris en charge, voir "Formats de pixels pris en charge" dans le chapitre “Graphics Contexts” de Quartz 2D Programming Guide.

Voici le direct link à cette liste.

+0

Ah d'accord. Je ne suis pas familier avec CGContexts donc vous en sauriez probablement plus que moi, mais la deuxième réponse à cette question serait: http://stackoverflow.com/questions/5545600/iphone-cgcontextref-cgbitmapcontextcreate-unsupported-parameter-combination émettre et accomplir la même chose que le code que j'ai maintenant? –

+0

SO ne montre pas toujours les réponses dans le même ordre, donc je ne sais pas lequel vous pensez être le second. Si vous voulez dire [celui-ci] (http://stackoverflow.com/a/8455299/1218876), le code est mauvais: il spécifie une partie du format (espace colorimétrique RVB) mais prend encore quelques parties de l'image originale (bits par component, bitmapInfo), vous pourriez donc vous retrouver avec une erreur similaire. [Cette réponse] (http://stackoverflow.com/a/17039624/1218876) est probablement meilleure. En fait, vous y êtes presque, utilisez simplement le code qui est commenté dans les lignes où vous codez 8 bits/pixel et kCGImageAlphaNoneSkipFirst. –

+0

Merci de m'avoir aidé mais de faire ce que vous avez recommandé n'a pas résolu le problème. J'ai posté ce que j'ai interprété à partir de votre réponse à la fin de ma question initiale, mais cela a entraîné les mêmes erreurs CGContexte. –

0

Vos deux appels à la fois CGBitmapContextCreate utilisez les bits non pris en charge/composants - bits/combinaisons de pixels (comme les erreurs CGContext vous dire).

Voir tableau 2.1 Quartz 2D Programming Guide pour obtenir une liste des formats de pixels pris en charge