2

所以这里的要点是我有一个程序,它有一个由许多小图像组成的大图像,它把这个图像分成许多更小的图像(比如电影的帧),然后用户可以去浏览。

我目前使用这种方法

- (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 可能会保留“largerImage”,这会导致它占用大量内存

4

2 回答 2

1

本质上,您的目标似乎是随机向用户显示图像的特定部分。

如果您只想显示图像的较小部分,则不必创建较小的图像。特别是如果大图像可以立即加载到内存中。而是尝试查看剪辑以调整图像的可见部分。

例如,你可以试试这个。

  1. 将大图像设置为UIImageViewand sizeToFit
  2. 将图像视图放在UIView.
  3. 将框架设置UIView为较小的图像尺寸。
  4. clipsToBoundsUIView的外在YES
  5. 调整transform内部UIImageView以控制可见部分。

UIScrollView除了通过用户交互自动滚动之外,这与您所做的基本相同。

这是一个代码示例。

- (void)viewDidLoad {
    [super viewDidLoad];

    UIImageView*    v1  =   [[UIImageView alloc] init];
    [v1 setImage:[UIImage imageWithContentsOfFile:@"large-image.png"]];
    [v1 sizeToFit];

    UIView* v2  =   [[UIView alloc] init];
    [v2 setFrame:CGRectMake(0, 0, 100, 100)];
    [v2 addSubview:v1];
    [v2 setClipsToBounds:YES];

    // Set transform later to adjust visible portion.
    v1.transform    =   CGAffineTransformMakeTranslation(-100, -100);

    [self.view addSubview:v2];
}
于 2014-07-14T11:32:53.480 回答
0

而不是在内存中使用小图像,如果它们是小尺寸的,请尝试将这些图像保存到数据库中。但我不明白为什么你需要将大图像裁剪成小图像?您可以使用 CATiledLayer 缩放和预览图像的一小部分,您只需要该部分的 CGRect。

于 2014-07-14T11:44:21.240 回答