2012-10-31 4 views
2

Je télécharge plusieurs images à partir du code ci-dessous et les enregistre dans la base de données. Mais pour certaines images, je suis en dessous de l'erreur.Comment vérifier si l'image PNG téléchargée est corrompue?

Erreur: ImageIO: distance invalide PNG trop loin Erreur: ImageIO: des données incorrectes PNG vérifier

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);        
dispatch_async(queue, ^{ 
    NSString *imgStr = [dict objectForKey:@"image"];     
    imgStr = [imgStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imgStr]]; 
    UIImage *image = [UIImage imageWithData:imgData]; 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     mYImageView.image = image; 
    }); 
}); 

enter image description here

Comment vérifier l'image enregistrée est valide ou non, donc je peux télécharger l'image encore?

+1

Vérifiez cette ... http: //stackoverflow.com/questions/3848280/catching-error-corrupt-jpeg-data-premature-end-of-data-segment ou http : //stackoverflow.com/questions/10552145/detect-if-png-file-is-corrupted-in-objective-c – Krunal

Répondre

6

Pour les images PNG, vérifiez leurs deux premiers octets et leurs deux derniers octets. Voici la méthode, j'espère que cela aidera.

Merci. :)

- (BOOL)isImageValid:(NSData *)data 
{ 
    BOOL val = YES; 

    if ([data length] < 4) 
     val = NO; 

    const char * bytes = (const char *)[data bytes]; 

    if (bytes[0] != 0x89 || bytes[1] != 0x50) 
     val = NO; 
    if (bytes[[data length] - 2] != 0x60 || 
     bytes[[data length] - 1] != 0x82) 
     val = NO; 

    return val; 
} 
Questions connexes