【问题标题】:Convert image with overlay view into UIImage将带有叠加视图的图像转换为 UIImage
【发布时间】:2012-05-30 19:47:42
【问题描述】:

在我的应用程序中,我有一个向用户显示的图像和由 CoreGraphics 自定义绘图的覆盖视图。我想将带有叠加层的图像保存到 CameraRoll 中。 那么我应该如何从现有的 UIImage 和自定义叠加视图中创建一个新的 UIImage 呢?

我尝试通过创建 CGContextRef,将 UIImage 绘制到其中,然后将覆盖视图的 CALayer 绘制到相同的上下文中来实现。但是我从这个上下文中得到的 UIImage 只是白色背景上的覆盖视图。它似乎没有保持透明度,只是用白色填充所有内容。

如何解决?

谢谢。

【问题讨论】:

    标签: objective-c cocoa-touch uiimage save overlay


    【解决方案1】:

    如果我理解你的问题。你有两个视图

    1. 向用户显示的图像(即 viewA)
    2. 带有自定义绘图的覆盖视图(即 viewB)

    如果您在 viewC 上创建另一个视图(即 viewC)添加子视图 viewA 和 viewB。

    [viewC addSubview:viewA]

    [viewC addSubview:viewB]

    现在在 viewC 上尝试 CGContextRef

    UIImage *outputImage = [self convertViewToImage:viewC :1];
    

    convertViewToImage 方法:

    +(UIImage*)convertViewToImage:(UIView*)view:(float)ratio{
    UIGraphicsBeginImageContext(view.bounds.size);
    //UIGraphicsBeginImageContext(view.frame.size);
    
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    CGImageRef imageRef = CGImageCreateWithImageInRect([viewImage CGImage], CGRectMake(0, 0, view.bounds.size.width*ratio, view.bounds.size.height*ratio));
    UIImage *targetImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    
    return targetImage;
    }
    

    我相信它会做到的。

    【讨论】:

    • 哦。那太棒了。我没有实现整个方法。我刚刚将[layer drawInContext:ctx] 更改为[layer renderInContext],现在叠加层已正确绘制在图像上。所以我创建了 CGContextRef ctx,然后是 [image drawInRect:CGRectmake(0.f,0.f,image.size.width,image.size.height)],然后是 [overlayView.layer renderInContext:ctx]。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2018-03-23
    相关资源
    最近更新 更多