Search code examples
iosimagepngtiling

Generating tiles from a large PNG


I'm looking to use CATiledLayer to display a huge PNG image on an iOS device. For this to work, I need to split the larger image into tiles (at 100%, 50%, 25% and 12.5%) on the client (creating tiles at the server side is not an option).

I can see that there are libraries such as libjpeg-turbo that may work, however these are for JPEGs and I need to work with PNGs.

Does anyone know of a way that I can take a large PNG (~20Mb) and generate tiles from it on the device?

Any pointers or suggestions would be appreciated!

Thank you!


Solution

  • You can use the built-in Core Graphics CGDataProviderCreateWithFilename and CGImageCreateWithPNGDataProvider APIs to open the image, then create each of the tiles by doing something like:

    const CGSize tileSize = CGSizeMake(256, 256);
    const CGPoint tileOrigin = ...; // Calculate using current column, row, and tile size.
    const CGRect tileFrame = CGRectMake(-tileOrigin.x, -tileOrigin.y, imageSize.width, imageSize.height);
    
    UIGraphicsBeginImageContextWithOptions(tileSize, YES, 1);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextDrawImage(context, tileFrame, image.CGImage);
    
    UIImage *tileImage = UIGraphicsGetImageFromCurrentImageContext();
    [UIImagePNGRepresentation(tileImage) writeToFile:tilePath atomically:YES];
    UIGraphicsEndImageContext();
    

    You may also want to look at the related sample projects (Large Image Downsizing, and PhotoScroller) referenced under the UIScrollView Class Reference.