iOS:将6x6 400x300px图像添加到一个合成图像

时间:2011-05-08 10:49:54

标签: iphone objective-c ios bitmap image-manipulation

我的开发人员和我正在创建一个创建合成图像的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);

1 个答案:

答案 0 :(得分:1)

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

你会在Apple's Scroll View's Programming Guide to iOS中找到一个好的入门书。

你只需要

  1. 创建新的滚动视图
  2. 将其contentSize属性设置为您要显示的超大图片的总大小
  3. 将一个大图像添加为子视图,或添加所有小图像,将它们放置在适当位置
  4. 如果你想制作一个大图像,你可以创建一个与滚动视图contentSize大小相同的大型自定义视图。然后,在自己的网格中绘制每个smaill图像。最后,将此大型自定义视图添加为滚动视图的子视图。

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

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

    编辑2:在上述指南中详细介绍了管理内存的方法,代码和所有内容。在平铺时看看ScrollViewSuite演示的第三个例子。因为你的图像已经由瓷砖组成,所以这应该对你有用。

    我们的想法是从滚动视图中创建一种表视图,现在可以回收图像切片而不是单元格。滚动视图是子类,一组可重用的磁贴保留为其实例变量之一。实现的关键是,在layoutSubviews中,从superview中移除已移出可见区域的切片,然后为新显示的内容回收切片并将其添加为子视图。这样,只有可见的图块被加载到内存中。

    希望这适合你。