Как создать образ из UILabel?

В настоящее время я разрабатываю простое приложение для фотошопа на iphone. Когда я хочу сгладить слои, надписи находятся в хорошем положении, но с плохим размером шрифта. Вот мой код для сглаживания:

UIGraphicsBeginImageContext(CGSizeMake(widthDocument,widthDocument));

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

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

Кто-нибудь может мне помочь?


person Jonathan    schedule 08.08.2012    source источник


Ответы (6)


От: извлечение UIImage из UITextView или UILabel дает белое изображение.

// 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 с использованием. кредит @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)
person DJPlayer    schedule 08.08.2012
comment
Да, я видел этот пост, но с этим решением я не могу получить файл с высоким разрешением. Но вы даете мне понять, в чем моя проблема! Большое тебе спасибо!! - person Jonathan; 09.08.2012
comment
@DJPlayer Чтобы получить четкое изображение для отображения сетчатки, нам нужно заменить первую строку в вашем методе на эту строку: UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0);, как показано в этом вопрос и принятый ответ. Возможно, вы захотите обновить свой ответ, включая эту информацию. - person anneblue; 22.07.2013
comment
Если вам нужно прозрачное изображение, установите непрозрачное значение NO в UIGraphicsBeginImageContextWithOptions - person Heberti Almeida; 05.11.2015
comment
Можно ли визуализировать этикетку в 3 раза больше ее реального размера без потери резкости? - person Kashif; 14.04.2020

Я создал расширение 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)
person Heberti Almeida    schedule 05.11.2015

вам нужно отобразить метку в контексте

заменять

[label drawTextInRect:label.frame];

с участием

[label.layer renderInContext:UIGraphicsGetCurrentContext()];

и вам нужно будет создать одно изображение для каждой метки, поэтому переместите цикл for за пределы контекстных вызовов begin и end.

person wattson12    schedule 08.08.2012

для 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
        }
    }
}
person dr OX    schedule 07.07.2016

Вы можете использовать renderInContext на любом CALayer. Он будет рисовать слой вашего представления в контексте. Чтобы вы могли изменить его на изображение. Также, если вы выполняете renderInContext в представлении, все его подпредставления будут отрисованы в контексте. Поэтому вместо того, чтобы перебирать все метки, при добавлении меток вы можете добавить их в containerView. И просто нужно сделать renderInContext в этом containerView.

person Sj.    schedule 08.08.2012

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
person kolbasek    schedule 09.10.2018
comment
Пожалуйста, не вставляйте код без объяснения причин. - person koen; 09.10.2018