如何从 UILabel 创建图像?

Posted

技术标签:

【中文标题】如何从 UILabel 创建图像?【英文标题】:How to create an image from UILabel? 【发布时间】:2012-08-05 17:14:43 【问题描述】:

我目前正在 iphone 上开发一个类似 Photoshop 的简单应用程序。当我想展平我的图层时,标签的位置很好,但字体大小很差。 这是我要展平的代码:

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument));

for (UILabel *label in arrayLabel) 
    [label drawTextInRect:label.frame];


UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

谁能帮帮我?

【问题讨论】:

【参考方案1】:
extension UIImage 

    class func imageFrom(text: String, width: CGFloat, font: UIFont, textAlignment: NSTextAlignment, lineBreakMode: NSLineBreakMode) -> UIImage? 
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
        label.text = text
        label.font = font
        label.textAlignment = textAlignment
        label.lineBreakMode = lineBreakMode

        label.sizeToFit()

        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
        label.layer.render(in: UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img
    


使用:

    let iv = UIImageView(image: UIImage.imageFrom(text: "Test For \nYarik", width: 537.0, font: UIFont.systemFont(ofSize: 30), textAlignment: .center, lineBreakMode: .byWordWrapping))
    iv.contentMode = .scaleAspectFit

【讨论】:

请不要在没有任何解释的情况下粘贴代码。【参考方案2】:

我创建了一个 Swift 扩展来将 UILabel 呈现为 UIImage

extension UIImage 
    class func imageWithLabel(label: UILabel) -> UIImage 
        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
        label.layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img
    

编辑:改进的 Swift 4 版本

extension UIImage 
    class func imageWithLabel(_ label: UILabel) -> UIImage 
        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0)
        defer  UIGraphicsEndImageContext() 
        label.layer.render(in: UIGraphicsGetCurrentContext()!)
        return UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
    

用法很简单:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22))
label.text = bulletString
let image = UIImage.imageWithLabel(label)

【讨论】:

【参考方案3】:

对于 Swift,我使用这个 UIView 扩展:

// Updated for Swift 3.0
extension UIView 
    var grabbedImage:UIImage? 
        get 
            UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)
            layer.render(in: UIGraphicsGetCurrentContext()!)
            let img = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return img
        
    

【讨论】:

【参考方案4】:

发件人:pulling an UIImage from a UITextView or UILabel gives white image。

// ios

- (UIImage *)grabImage 
    // Create a "canvas" (image context) to draw in.
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0);  // high res
    // Make the CALayer to draw in our "canvas".
    [[self layer] renderInContext: UIGraphicsGetCurrentContext()];

    // Fetch an UIImage of our "canvas".
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    // Stop the "canvas" from accepting any input.
    UIGraphicsEndImageContext();

    // Return the image.
    return image;

// 带有用法的 Swift 扩展。在下面的 cmets 中注明@Heberti Almeida

extension UIImage 
    class func imageWithLabel(label: UILabel) -> UIImage 
        UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0.0)
        label.layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img
    

用法:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 30, height: 22))
label.text = bulletString
let image = UIImage.imageWithLabel(label)

【讨论】:

是的,我看过这篇文章,但是使用这个解决方案我无法获得高清文件。但是你让我明白我的问题在哪里!非常感谢!! @DJPlayer 要为视网膜显示获得清晰的图像,我们需要将您方法中的第一行替换为以下行:UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0);,如在this question 中所见及其接受的答案。也许您可能想更新您的答案,包括该信息。 如果您需要在UIGraphicsBeginImageContextWithOptions 中设置不透明为NO 的透明图像 是否可以将标签渲染为实际大小的 3 倍而不损失清晰度?【参考方案5】:

您可以在任何 CALayer 上使用 renderInContext。它将在上下文中绘制您的视图层。这样您就可以将其更改为图像。此外,如果您在 view 上执行 renderInContext ,它的所有子视图都将被绘制到上下文中。因此,您可以在添加标签时将它们添加到 containerView,而不是遍历所有标签。并且只需要在该 containerView 上执行 renderInContext。

【讨论】:

【参考方案6】:

您需要在上下文中呈现标签

替换

[label drawTextInRect:label.frame];

[label.layer renderInContext:UIGraphicsGetCurrentContext()];

您需要为每个标签创建一个图像,因此将 for 循环移到开始和结束上下文调用之外

【讨论】:

以上是关于如何从 UILabel 创建图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIImageVIew 实时移动到 UILabel 的位置?

如何在不改变文本透明度的情况下为 UILabel 设置背景图像并调整其 alpha?

ios:如何在背景图像上添加 uiLabel?

UILabel 阻止 UIButton 显示,直到您从调试视图层次结构继续

创建类似于选中的 UITableViewCell 的 UILabel 背景

如何从 UILabel 中删除 UIAppearance 设置?