在iOS和大多数移动设备上,由于内存限制,您可以加载的图像大小受到限制。是否有可能在磁盘上有一个大图像(比如5,000像素乘5000像素),但只能在该图像中读取一个较小的矩形(比如说100x100)进入内存进行显示?
换句话说,如果你只想查看它的一小部分,是否需要将整个图像加载到内存中?如果只能加载较小的部分,我们该怎么办呢?
通过这种方式,人们可以像spritesheets那样为重复内容节省大量空间。值得注意的是,总体目标是最小化文件大小,以便使用jpeg或png或其他类型的压缩来压缩大图像。我怀疑视频格式是这样的,因为你永远不会将整个视频加载到内存中。
答案 0 :(得分:2)
虽然我没有使用这些技术,但您可能会发现以下Apple示例有用:
答案 1 :(得分:1)
您可以使用映射的NSData
执行此操作:
UIImage *pixelDataForRect(NSString *fileName, const CGRect pixelRect)
{
// get the pixels from that image
uint32_t width = pixelRect.size.width;
uint32_t height = pixelRect.size.height;
// create the context
UIGraphicsBeginImageContext(CGSizeMake(width, height));
CGContextRef bitMapContext = UIGraphicsGetCurrentContext();
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, height);
CGContextConcatCTM(bitMapContext, flipVertical);
// render the image (assume PNG compression)
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef) [NSData dataWithContentsOfMappedFile:fileName]);
CGImageRef image = CGImageCreateWithPNGDataProvider(provider, NULL, YES, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
uint32_t imageWidth = CGImageGetWidth(image);
uint32_t imageHeight = CGImageGetHeight(image);
CGRect drawRect = CGRectMake(-pixelRect.origin.x, -((imageHeight - pixelRect.origin.y) - height), imageWidth, imageHeight);
CGContextDrawImage(bitMapContext, drawRect, image);
CGImageRelease(image);
UIImage *retImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return retImage;
}
答案 2 :(得分:0)
您最好的选择是使用带有CATiledLayer的UIScrollView。
查看WWDC 2010中的“使用滚动视图设计应用程序”演示文稿,了解如何执行此操作:
https://developer.apple.com/videos/wwdc/2010/
我们的想法是将您的大图像切割成瓷砖,然后使用UIScrollView为您的用户提供图像的可滚动视图,仅根据位置加载图像的那些部分。滚动视图。这是使用CATiledLayer完成的。