it-swarm.com.de

Wie füge ich einem Bild in iOS Swift Text hinzu?

Ich habe mich umgesehen und konnte nicht herausfinden, wie Text aufgenommen, einem Bild überlagert und dann die beiden zu einem einzigen UIImage kombiniert werden.

Ich habe Google mit den Suchbegriffen erschöpft, an die ich denken kann. Wenn also jemand eine Lösung hat oder zumindest einen Hinweis hat, kann er sich darauf freuen.

Ok ... ich habe es herausgefunden:

func textToImage(drawText: NSString, inImage: UIImage, atPoint: CGPoint) -> UIImage{

    // Setup the font specific variables
    var textColor = UIColor.whiteColor()
    var textFont = UIFont(name: "Helvetica Bold", size: 12)!

    // Setup the image context using the passed image
    let scale = UIScreen.mainScreen().scale
    UIGraphicsBeginImageContextWithOptions(inImage.size, false, scale)

    // Setup the font attributes that will be later used to dictate how the text should be drawn
    let textFontAttributes = [
        NSFontAttributeName: textFont,
        NSForegroundColorAttributeName: textColor,
    ]

    // Put the image into a rectangle as large as the original image
    inImage.drawInRect(CGRectMake(0, 0, inImage.size.width, inImage.size.height))

    // Create a point within the space that is as bit as the image
    var rect = CGRectMake(atPoint.x, atPoint.y, inImage.size.width, inImage.size.height)

    // Draw the text into an image
    drawText.drawInRect(rect, withAttributes: textFontAttributes)

    // Create a new image out of the images we have created
    var newImage = UIGraphicsGetImageFromCurrentImageContext()

    // End the context now that we have the image we need
    UIGraphicsEndImageContext()

    //Pass the image back up to the caller
    return newImage

}

Um es anzurufen, übergeben Sie einfach ein Bild:

textToImage("000", inImage: UIImage(named:"thisImage.png")!, atPoint: CGPointMake(20, 20))

Die folgenden Links haben mir geholfen, dies klarer zu verstehen:

Swift - Zeichnen von Text mit drawInRect: withAttributes:

Wie schreibe ich in Objective-C (iOS) Text auf ein Bild?

Das ursprüngliche Ziel bestand darin, ein dynamisches Bild zu erstellen, das ich in einer AnnotaionView verwenden könnte, beispielsweise einen Preis an einer bestimmten Position auf einer Karte zu platzieren, und dies hat sich hervorragend bewährt. Ich hoffe, das hilft jemandem, der versucht, dasselbe zu tun.

Für Swift 3:

 func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
    let textColor = UIColor.white
    let textFont = UIFont(name: "Helvetica Bold", size: 12)!

    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(image.size, false, scale)

    let textFontAttributes = [
        NSFontAttributeName: textFont,
        NSForegroundColorAttributeName: textColor,
        ] as [String : Any]
    image.draw(in: CGRect(Origin: CGPoint.zero, size: image.size))

    let rect = CGRect(Origin: point, size: image.size)
    text.draw(in: rect, withAttributes: textFontAttributes)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage!
 }

Für Swift 4:

 func textToImage(drawText text: String, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {
    let textColor = UIColor.white
    let textFont = UIFont(name: "Helvetica Bold", size: 12)!

    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(image.size, false, scale)

    let textFontAttributes = [
        NSAttributedStringKey.font: textFont,
        NSAttributedStringKey.foregroundColor: textColor,
        ] as [NSAttributedStringKey : Any]
    image.draw(in: CGRect(Origin: CGPoint.zero, size: image.size))

    let rect = CGRect(Origin: point, size: image.size)
    text.draw(in: rect, withAttributes: textFontAttributes)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage!
 }

Meine einfache Lösung:

func generateImageWithText(text: String) -> UIImage
{
    let image = UIImage(named: "imageWithoutText")!

    let imageView = UIImageView(image: image)
    imageView.backgroundColor = UIColor.clearColor()
    imageView.frame = CGRectMake(0, 0, image.size.width, image.size.height)

    let label = UILabel(frame: CGRectMake(0, 0, image.size.width, image.size.height))
    label.backgroundColor = UIColor.clearColor()
    label.textAlignment = .Center
    label.textColor = UIColor.whiteColor()
    label.text = text

    UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0);
    imageView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    label.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let imageWithText = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext();

    return imageWithText
}
15
Darkngs

Sie können auch einen CATextLayer ausführen.

    // 1
let textLayer = CATextLayer()
textLayer.frame = someView.bounds

// 2
var string = ""
for _ in 1...20 {
  string += "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor arcu quis velit congue dictum. "
}

textLayer.string = string

// 3
let fontName: CFStringRef = "Noteworthy-Light"
textLayer.font = CTFontCreateWithName(fontName, fontSize, nil)

// 4
textLayer.foregroundColor = UIColor.darkGrayColor().CGColor
textLayer.wrapped = true
textLayer.alignmentMode = kCAAlignmentLeft
textLayer.contentsScale = UIScreen.mainScreen().scale
someView.layer.addSublayer(textLayer)

http://www.raywenderlich.com/90488/calayer-in-ios-with-Swift-10-examples

9
Aspen

Ich habe eine Erweiterung erstellt, um sie überall einzusetzen:

import Foundation
import UIKit
extension UIImage {

    class func createImageWithLabelOverlay(label: UILabel,imageSize: CGSize, image: UIImage) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(CGSize(width: imageSize.width, height: imageSize.height), false, 2.0)
        let currentView = UIView.init(frame: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
        let currentImage = UIImageView.init(image: image)
        currentImage.frame = CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height)
        currentView.addSubview(currentImage)
        currentView.addSubview(label)
        currentView.layer.render(in: UIGraphicsGetCurrentContext()!)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img!
    }

}

Verwendung: Auf Ihrem ViewController, wo Sie die Größe und das hinzuzufügende Label haben, verwenden Sie es wie folgt: 

let newImageWithOverlay = UIImage.createImageWithLabelOverlay(label: labelToAdd, imageSize: size, image: editedImage)
4

Für Swift 4:  

func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {


    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(image.size, false, scale)

    image.draw(in: CGRect(Origin: CGPoint.zero, size: image.size))

    let rect = CGRect(Origin: point, size: image.size)

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.alignment = .center



    let attrs = [NSAttributedStringKey.font: UIFont(name: "Helvetica Bold", size: 12)!,NSAttributedStringKey.foregroundColor : UIColor.white , NSAttributedStringKey.paragraphStyle: paragraphStyle]


    text.draw(with: rect, options: .usesLineFragmentOrigin, attributes: attrs, context: nil)



    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage!
}
2
Yasin Aktimur

Ich kann in Ihrer ersten Frage nichts sehen, was darauf hindeutet, dass dies ausschließlich im Code erfolgen muss. Warum fügen Sie also nicht einfach ein UILabel im Interface Builder hinzu und fügen Sie Einschränkungen hinzu, um ihm dieselbe Länge und Breite zu geben wie Ihr Bild, zentrieren Sie es vertikal und horizontal (oder wie Sie es benötigen), löschen Sie den Beschriftungstext, legen Sie die Schriftart, -größe, -farbe usw. je nach Bedarf fest (einschließlich Ankreuzen von Autoshrink mit der gewünschten Mindestgröße oder Skalierung) und stellen Sie sicher, dass der Hintergrund transparent ist.

Verbinden Sie es dann einfach mit einem IBOutlet und setzen Sie den Text nach Bedarf in den Code (z. B. in viewWillAppear oder mithilfe eines ViewModel-Ansatzes und der Initialisierung des View/View-Controllers).

1
Gsp