使用 UIImage 和其他属性创建自定义图像

Creating a custom image with UIImage and other attributes

我希望在 iOS 中创建自定义图像。例如,该图像将用于分享到社交网站。

例如,用户可能 select 一张我们参考为 UIImage 的照片。使用此图像,我们想创建另一个包含原始图像的图像。

想法是创建一个宝丽来风格的图像,底部有一些 writing/wording。实现这一目标的最佳方法是什么?

我的第一个想法是创建一个 XIB 来控制布局并初始化这个关闭屏幕,使用快照创建完成的 UIImagedealloc 视图。或者使用 CGContextDrawImage 会更好吗?担心的是布局,如果我们有多个需要特定布局的项目,上下文绘制将很容易完成

我能够在下面创建这张图片: Polaroid

通过以下方法:

  1. 像拍立得一样设置 XIB: 我的非常静态,但您可以使用文件所有者和其他一些魔法轻松设置图像和文本。

  2. 使用以下内容设置 class 文件:

    import Foundation
    import UIKit
    
    class LoveIs: UIView {
    
    class func instanceFromNib() -> UIView {
        return UINib(nibName: "Polaroid", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
    }    }
    
  3. 像这样设置主视图控制器(一个 'fetching' 图像):

    var loveIs: UIView? = nil
    
    loveIs = LoveIs.instanceFromNib()
    
    loveIs?.layer.borderColor = UIColor.darkGrayColor().CGColor
    loveIs?.layer.borderWidth = 5
    UIGraphicsBeginImageContext((loveIs?.bounds.size)!)
    loveIs?.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    UIImageWriteToSavedPhotosAlbum(image, self, nil, nil)
    

您可以创建一个 UIView 并向其添加 UIImageView 和 UILabel。然后截取该视图的屏幕截图。

解决方案 1:

UIGraphicsBeginImageContext(screenShotView.bounds.size)
screenShotView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
letscreenShot  = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

解决方案 2:

var screenShot:UIView = screenShotView.snapshotViewAfterScreenUpdates(true)
UIGraphicsBeginImageContextWithOptions(screenShotView.bounds.size, true, 0.0)
screenShot.drawViewHierarchyInRect(screenShotView.bounds, afterScreenUpdates: true)
var shotCapture :UIImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

我建议在代码中生成图像,因为屏幕快照会限制您的屏幕大小。我还发现当一切都在代码中时,管理复杂的操作会更容易。

CGContextDrawImage将帮助您将原始图像复制到新图像的区域。

下面是一个示例,说明如何自己创建包含居中文本和形状的图像(在本例中为三角形,上方为矩形框,名称居中)。

// Get font from custom class and create text styles
UIFont *font = [CBFontHelper robotoMedium:32.0f];
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
paragraphStyle.alignment = NSTextAlignmentCenter;
NSDictionary *textAttributes = @{
        NSFontAttributeName: font,
        NSForegroundColorAttributeName: [CBColourHelper white],
};
CGSize textSize = [name sizeWithAttributes:textAttributes];
// various bits of paddings and heights neccessary to calculate total image size
float gap = 2.0f;
float textHeight = 0.3f*interfacePadding + textSize.height + 0.3f*interfacePadding;
float width = 200;
float height = textHeight + gap + 2*interfacePadding;

//create new image context
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width,height), false, 0.0f);
// Fill rectangle to hold name
[[CBColourHelper sandstone] setFill];
UIRectFill(CGRectMake(0.0f,0.0f,width,textHeight));

//Draw name over rectangle
[self drawString:name withFont:font inRect:CGRectMake(0.5f*interfacePadding, 0.3f*interfacePadding, width, height)];

// Draw triangle
[[CBColourHelper sandstone] setFill];
UIBezierPath *triangle = [UIBezierPath bezierPath];
[triangle moveToPoint:CGPointMake(width/2,textHeight + gap)];
[triangle addLineToPoint:CGPointMake(width/2,height)];
[triangle addLineToPoint:CGPointMake(width/2+5.0f*interfacePadding,textHeight + gap)];
[triangle closePath];
[triangle fill];

// Get image from context 
UIImage *markerImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();