快速向图像添加文本

时间:2019-03-25 23:41:00

标签: ios swift memory memory-management uiimage

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

从直觉上讲,此循环应保持不变的存储,但是,如下图所示,它需要线性存储,并且在存储大量图像时会导致存储错误。

Allocation instrument

如何使用常量内存进行此类操作?

编辑:我认为我可能对此简化了一些。 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
}

0 个答案:

没有答案