代码之家  ›  专栏  ›  技术社区  ›  StuartM

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

  •  2
  • StuartM  · 技术社区  · 8 年前

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

    例如,用户可以选择一张我们引用的照片作为 UIImage 。使用此图像,我们希望创建包含原始图像的另一个图像。

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

    我的第一个想法是创建一个 XIB 它控制布局并在屏幕外初始化,使用快照创建完成的 UI图像 dealloc 视图。还是最好使用 CGContextDrawImage ? 担心的是布局,如果我们有多个项目需要特定的布局,那么上下文绘制将很容易完成

    3 回复  |  直到 8 年前
        1
  •  1
  •   Nisse Engström vivek singh    8 年前

    我能够在下面创建此图像: Polaroid

    通过以下方法:

    1. 像偏光片一样设置XIB: Static 我的是非常静态的,但是你可以使用文件所有者和其他一些魔法来轻松设置你的图像和文本。

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

      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. 设置主视图控制器(一个“获取”图像),如下所示:

      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)
      
        2
  •  0
  •   Arun Gupta    8 年前

    您可以创建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();
    
        3
  •  0
  •   zveljkovic    8 年前

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

    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();