• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - imageWithCGImage 的内存问题

[复制链接]
菜鸟教程小白 发表于 2022-12-12 23:48:26 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

所以这里的要点是我有一个程序,它有一个由许多小图像组成的大图像,它获取这个图像并将它分成许多较小的图像(如电影的帧),然后用户可以去擦洗通过。

我目前使用这种方法

- (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”,这会导致它占用大量内存



Best Answer-推荐答案


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

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

例如,你可以试试这个。

  1. 将大图设置为 UIImageViewsizeToFit
  2. 将 ImageView 放在 UIView 中。
  3. UIView的frame设置为小图片。
  4. clipsToBounds 将外部 UIView 改为 YES
  5. 调整内部UIImageViewtransform控制可见部分。

这与您对 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];
}

关于ios - imageWithCGImage 的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24727599/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap