ios - 在循环中快速将文本添加到图像
问题描述
我正在使用 swift 将文本添加到图像数组中。下面是我的循环代码:
var holderClass = HolderClass()
var newImages = [UIImage]()
var counter = 0
for (index, oldImage) in holderClass.oldImages.enumerated(){
let newImage = drawTextAtLoaction(text: "testing", image: oldImage)
newImages[index] = newImage
counter+=1
if(counter == self.storyModule.getImageCount()){
completionHandler(newImages)
}
}
这是添加文本功能:
func drawTextAtLoaction(text: String, image: UIImage) -> 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 = [
NSAttributedString.Key.font: textFont,
NSAttributedString.Key.foregroundColor: textColor,
] as [NSAttributedString.Key : Any]
image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: image.size)
text.draw(in: rect, withAttributes: textFontAttributes)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if newImage != nil{
return newImage!
}else{
return image
}
}
直观地说,这个循环应该采用常量存储,但是,如下图所示,它采用线性存储,并且会导致大量图像的内存错误。
如何使用常量内存进行这样的操作?
编辑:我认为我可能有点过于简化了。oldImages 数组实际上是对象内的图像数组。所以旧图像的初始化看起来是这样的。
class HolderClass{
private var oldImages: [UIImage]!
init(){
oldImages = [UIImage(), UIImage()]
}
}
编辑2:这是加载图像数据的方式。以下代码在 viewDidLoad 中。
var holderClass = HolderClass()
DispatchQueue.global(qos: .background).async {
var dataIntermediate = [StoryData]()
let dataRequest:NSFetchRequest<StoryData> = StoryData.fetchRequest()
do {
dataIntermediate = try self.managedObjectContext.fetch(dataRequest)
for storyData in dataIntermediate{
var retrievedImageArray = [UIImage]()
if let loadedImage = DocumentSaveManager.loadImageFromPath(imageId: Int(storyData.id)){
retrievedImageArray.append(loadedImage)
}
holderData.oldImages = retrievedImageArray
}
}catch{
print("Failed to load data \(error.localizedDescription)")
}
}
这是 DocumentSaveManager 类。
static func documentDirectoryURL() -> URL {
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
return documentsURL
}
static func saveInDocumentsDirectory(foldername:String, filename: String) -> URL {
let fileURL = documentDirectoryURL().appendingPathComponent(foldername).appendingPathComponent(filename)
return fileURL
}
static func loadImageFromPath(moduleId: Int, imageId: Int) -> UIImage? {
let path = saveInDocumentsDirectory(foldername: String(describing: moduleId), filename: String(describing: imageId)).path
let image = UIImage(contentsOfFile: path)
if image == nil {
return nil // Remember to alert user
}
return image
}
解决方案
推荐阅读
- python - 在 MacOS 上安装 pip 包失败,出现“错误:命令‘gcc’失败,退出状态为 1”
- java - Blazor WASM / Java:选择文本并模拟 KeyPress
- node.js - axios 获取请求返回未定义对象
- python - 提取两个列表项的任何排列之间的所有子字符串
- javascript - Nodejs 使用未定义的 Json 处理 Api
- sql - 使用 R 将相同的 SQL 表附加到新数据
- php - WooCommerce:在保存帖子之前更新字段值
- r - 如何解决 rbacon 的 Bacon 函数中的错误?
- r - 将日期格式从 dd.mm.yyyy 更改为 ddmmmyyyy
- python - 如何使用 tkinter 将窗口附加到主窗口?