我和我的开发伙伴正在创建一个 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 中找到一本很好的入门书.
你只需要
- 创建一个新的 ScrollView
- 将其
contentSize
属性设置为您要显示的超大图像的总大小 - 添加一个大图像作为 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/