首页 > 解决方案 > 在循环中快速将文本添加到图像

问题描述

我正在使用 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
}

标签: iosswiftmemorymemory-managementuiimage

解决方案


推荐阅读