iphone - iOS:将 6x6 400x300px 图像添加到一张合成图像

标签 iphone objective-c ios bitmap image-manipulation

我和我的开发伙伴正在创建一个 iPhone 应用程序来创建合成图像。这个想法是在 6x6 网格中有 36 张图像。每张原始图像为 400x300 像素。因此,处理后的最终图像应为 2400x1800px。

免责声明:我并不是专门为自己编写此程序。我的同事程序员不在 SO 上,出于各种原因我不得不找他。我个人是一名 .Net 开发人员,如果我的问题很明显,请原谅我。

现在,显然这会造成内存问题。到目前为止,他的解决方案是尝试将合成绘制到 UIImageView 或 CATiledLayer,并通过截取 View 的屏幕截图来保存合成。到目前为止,所有尝试要么由于内存问题导致应用程序崩溃,要么在合成中产生黑色区域。

我的问题大概很简单。我们如何创建一个大的(屏幕外?)图像,将 36 个部分图像绘制到这个合成中,保存合成,然后将其放入用户可以查看的适当组件中?

编辑:

我哥们最后自己找到了解决办法。我会将它与接受的答案一起发布在这里,以便为 SO wiki 做出贡献:)

UIGraphicsBeginImageContext(svPreview.contentSize);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextFillRect(ctx, CGRectMake(0, 0, svPreview.contentSize.width, svPreview.contentSize.height));

    for(UIImageView *subview in [svPreview subviews]) {
        [subview.image drawAtPoint:subview.frame.origin];
    }

    UIImage *rawImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIImageWriteToSavedPhotosAlbum(rawImage, self, nil, nil);

最佳答案

显而易见的机制是 UIScrollView。它是一个用于显示比屏幕大的图像或一组图像的对象,并且具有易于实现的缩放和滚动功能。

您会在 Apple's Scroll View's Programming Guide to iOS 中找到一本很好的入门书.

你只需要

  1. 创建一个新的 ScrollView
  2. 将其 contentSize 属性设置为您要显示的超大图像的总大小
  3. 添加一个大图像作为 subview ,或者添加所有小图像,将它们适本地放置在一起

如果您想制作一个大图像,您可以创建一个与 ScrollView 的 contentSize 大小相同的大型自定义 View 。然后,在自己的网格中绘制每个小图像。最后,将这个大的自定义 View 添加为 ScrollView 的 subview 。

这是显而易见的解决方案,但它可能会满足您的所有需求,并为您提供一些额外的功能。

编辑: ScrollView 可能是一个很好的起点,但您仍然可能会遇到内存限制。搜索有关使 ScrollView 更高效的答案可能会有所帮助。您可能会在这个相关问题中找到一些好主意:ScrollView runs out of memory when it gets too big

编辑 2: 管理内存的方法在上述指南中有详细的代码和所有内容。看看 ScrollViewSuite演示的第三个示例,关于平铺。这应该非常适合您,因为您的图像已经由图 block 组成。

想法是从 ScrollView 中创建一种表格 View ,现在回收图像 block 而不是单元格。 ScrollView 被子类化,一组可重用的图 block 被保留为它的一个实例变量。实现的关键是,在 layoutSubviews 中,将已经移出可见区域的 tile 从 superview 中移除,然后回收新可见内容的 tile 并将它们添加为 subview 。这样,只有可见的图 block 才会加载到内存中。

希望这对你有用。

关于iphone - iOS:将 6x6 400x300px 图像添加到一张合成图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5926976/

相关文章:

ios - popToViewController 之后未调用 viewWillAppear

ios - 如何在检测到自上次屏幕触摸后用户不活动/空闲时间时注销应用程序

ios - UISwipeGestureRecognizer 工作方向错误

ios - 获取NSUserdefaults时出现问题

ios - Peer2Peer CouchbaseListener

ios - 基于旋转更新约束(X、Y、W、H)时出错?

iphone - 事件从 iPhone 删除应用程序时

iphone - 如何在 UILabel 的多行文本之间动态添加新文本

iphone - 如何在 iPhone 中阻止来电

iphone - 这个 iPhone 应用程序失败的可能性有多大?