所以这里有一个要点我有一个程序,它有一个由许多小图像组成的大图像,它将这个图像分成许多较小的图像(如电影的帧)然后用户可以去擦洗通过
我目前使用此方法
- (NSMutableArray *)createArrayFromImage: (NSData *)largerImageData
{
UIImage *largerImage = [UIImage imageWithData: largerImageData];
int arraySize = (int)largerImage.size.height/largerImage.size.width; //Find out how many images there are
NSMutableArray *imageArray = [[NSMutableArray alloc] init];
for (int i = 0; i < arraySize; i++) {
CGRect cropRect = CGRectMake(0, largerImage.size.width * i, largerImage.size.width, largerImage.size.width);
CGImageRef imageRef = CGImageCreateWithImageInRect([largerImage CGImage], cropRect);
UIImage *image = [UIImage imageWithCGImage: imageRef];
CGImageRelease(imageRef);
[imageArray addObject: UIImageJPEGRepresentation(image, 1.0)];
NSLog(@"Added image %d", i);
}
NSLog(@"Final size %d", (int)[imageArray count]);
return imageArray;
}
然而,由于UIImageJPEGRepresentation
被调用,这非常慢,如果我只是将UIImage
直接添加到数组中,那么当用户擦除数组中的图像时会更快它开始分配大量内存,迫使应用程序最终崩溃。如果有帮助,它会调用[UIImageView setImage:];
。对此的任何帮助都将非常感激。
ED | T:CGImageCreateWithImageInRect可能会保留“largeImage”,这会导致它占用大量内存
答案 0 :(得分:1)
基本上,您的目标似乎是随机向用户显示图像的特定部分。
如果您想要做的只是显示图像的较小部分,则不必创建较小的图像。特别是如果大图像可以立即加载到存储器中。 而是尝试查看剪裁以调整图像的可见部分。
例如,你可以试试这个。
UIImageView
和sizeToFit
。UIView
。UIView
的帧设置为较小的图像尺寸。clipsToBounds
至UIView
的YES
。transform
的{{1}}以控制可见部分。这与您使用UIImageView
所做的基本相同,除了通过用户交互自动滚动。
这是一个代码示例。
UIScrollView
答案 1 :(得分:0)
而是在内存中使用小图像,如果它们的尺寸很小,请尝试将此图像保存到DB。但我不明白为什么你需要将一个大图像裁剪成一个小图像?您可以使用CATiledLayer ZOOM和预览图像的一小部分,而您只需要该部分的CGRect。