fotos español dibujar app ios swift uiimage

dibujar - shortcuts ios 12 español



¿Cómo agrego texto a una imagen en iOS Swift? (6)

He creado una extensión para usarlo en todas partes:

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! } }

Uso: en cualquier lugar de su ViewController donde tenga el tamaño y la etiqueta para agregar, úselo de la siguiente manera:

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

He mirado a mi alrededor y no he logrado descifrar cómo tomar el texto, superponerlo en una imagen y luego combinarlos en un solo UIImage .

He agotado a Google usando los términos de búsqueda en los que puedo pensar, por lo que si alguien tiene una solución o al menos una sugerencia que puedan señalar, sería muy apreciada.


Mi solución simple:

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 }


No puedo ver nada en su pregunta inicial que sugiera que esto debe hacerse exclusivamente en código, entonces, ¿por qué no simplemente agregar un UILabel en el generador de interfaces y agregar restricciones para darle la misma longitud y ancho que su imagen, centrarlo verticalmente y horizontalmente (o como lo necesite), elimine el texto de la etiqueta, establezca la fuente, el tamaño, el color, etc. del texto según sea necesario (incluyendo marcar Autoshrink con cualquier tamaño o escala mínima que necesite) y asegúrese de que su fondo sea transparente.

Luego, simplemente conéctelo a un IBOutlet y configure el texto en el código según sea necesario (por ejemplo, en viewWillAppear, o utilizando un enfoque ViewModel y configurándolo en la inicialización de su controlador de vista / vista).


Ok ... lo descubrí:

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 }

Para llamarlo, simplemente pasa una imagen:

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

Los siguientes enlaces me ayudaron a aclarar esto:

Swift - Dibujando texto con drawInRect: withAttributes:

¿Cómo escribir texto en imagen en Objective-C (iOS)?

El objetivo original era crear una imagen dinámica que pudiera usar en un AnnotaionView , como poner un precio en un lugar determinado en un mapa y funcionó muy bien. Espero que esto ayude a alguien que intenta hacer lo mismo.

Para 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! }

Para 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! }


También puedes hacer un CATextLayer.

// 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


Para 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! }