Search code examples
iospngzliblibpng

PNG validation on iOS


Writing a mapping application on iOS, making use of OpenStreetMap tiles. Map tile images are downloaded asynchronously and stored in a dictionary, or persisted in a SQLite DB.

Occasionally, for whatever reason, while attempting to render a map tile image, I get the following error:
ImageIO: <ERROR> PNGinvalid distance too far back

This causes nasty black squares to appear over my map.

This is the piece of code in which this occurs:

NSData *imageData = [TileDownloader RetrieveDataAtTileX:(int)tilex Y:(int)tiley Zoom:(int)zoomLevel];  
if (imageData != nil) {
    NSLog(@"Obtained image data\n");
    UIImage *img = [[UIImage imageWithData:imageData] retain];
    // Perform the image render on the current UI context.  
    // ERROR OCCURS BETWEEN PUSH AND POP
    UIGraphicsPushContext(context);
    [img drawInRect:[self rectForMapRect:mapRect] blendMode:kCGBlendModeNormal alpha:1.0f];
    UIGraphicsPopContext();
    [img release];
}

Now, what I'm looking for is a way to ensure a png is valid before attempting to render it to my map.

Edit: The system also occasionally throws this error:
ImageIO: <ERROR> PNGIDAT: CRC error


Solution

  • Switched from my own Asynchronous Download Queue Manager to the All Seeing I implementation. Problem became a moot point.