我的开发人员和我正在创建一个创建合成图像的iPhone应用程序。这个想法是在6x6网格中有36个图像。每张原始图片均为400x300px。因此,处理后的最终图像应为2400x1800px。
免责声明:我自己并没有特别做这个编程。我的同事程序员不是因为各种原因我不得不要求他。我个人是.Net开发人员,请原谅我的问题,如果这很明显。
现在,显然这会造成内存问题。到目前为止,他的解决方案是尝试将合成绘制到UIImageView或CATiledLayer,并通过截取视图的截图来保存合成。到目前为止,所有尝试都由于存储器问题而使应用程序崩溃,或者在组合中产生黑色区域。
我的问题大概很简单。我们如何创建一个大的(屏幕外?)图像,将36个部分图像绘制到该合成中,保存合成,然后将其放入可供用户查看的适当组件中?
修改
我的好友最终找到了解决方案。我将在此处与已接受的答案一起发布,以便为SO维基做贡献:)
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);
答案 0 :(得分:1)
显而易见的机制是UIScrollView。它是一个用于显示比屏幕大的图像或一组图像的对象,它具有易于实现的缩放和滚动功能。
你会在Apple's Scroll View's Programming Guide to iOS中找到一个好的入门书。
你只需要
contentSize
属性设置为您要显示的超大图片的总大小如果你想制作一个大图像,你可以创建一个与滚动视图contentSize
大小相同的大型自定义视图。然后,在自己的网格中绘制每个smaill图像。最后,将此大型自定义视图添加为滚动视图的子视图。
这是一个显而易见的解决方案,但它可能会为您提供所需的一切,并为您提供额外的功能。
编辑:滚动视图可能是一个很好的起点,但您仍可能遇到内存限制。搜索有关使滚动视图更有效的答案可能会有所帮助。您可以在此相关问题中找到一些好主意:ScrollView runs out of memory when it gets too big
编辑2:在上述指南中详细介绍了管理内存的方法,代码和所有内容。在平铺时看看ScrollViewSuite演示的第三个例子。因为你的图像已经由瓷砖组成,所以这应该对你有用。
我们的想法是从滚动视图中创建一种表视图,现在可以回收图像切片而不是单元格。滚动视图是子类,一组可重用的磁贴保留为其实例变量之一。实现的关键是,在layoutSubviews
中,从superview中移除已移出可见区域的切片,然后为新显示的内容回收切片并将其添加为子视图。这样,只有可见的图块被加载到内存中。
希望这适合你。