I am new to Mac OS App Development with Swift. But I tried to make the simple ImageResizer app. I have to resize 50k images. After 10 hours, the memory has increased to nealy 120GB. I thought Swift also has Garbage collector. Why does it increase memory? I will show you my code.
for i in 0..<paths.count {
let path = paths[i]
if let image = NSImage(contentsOf: path) {
...
if self.resize(image: image, size: size, to: URL(fileURLWithPath: resizedImagePath)) {
print("Image saved to (resizedImagePath)")
continue
}
}
}
func resize(image: NSImage, size: Int, to url: URL) -> Bool {
if !image.isValid {
print("invalid image")
return false
}
guard let pixelsWide = image.representations.first?.pixelsWide else {
return false
}
let factor: CGFloat = CGFloat(pixelsWide) / image.size.width
var width: CGFloat = CGFloat(size)
var height: CGFloat = CGFloat(size)
if image.size.width > image.size.height {
height = width * image.size.height / image.size.width
} else {
width = height * image.size.width / image.size.height
}
let rep = NSBitmapImageRep(bitmapDataPlanes: nil,
pixelsWide: Int(width),
pixelsHigh: Int(height),
bitsPerSample: 8,
samplesPerPixel: 4,
hasAlpha: true,
isPlanar: false,
colorSpaceName: .deviceRGB,
bytesPerRow: Int(width * 4),
bitsPerPixel: 32)
rep?.size = NSSize(width: width / factor, height: height / factor)
let ctx = NSGraphicsContext(bitmapImageRep: rep!)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.current = ctx
image.draw(in: NSMakeRect(0, 0, width / factor, height / factor))
ctx?.flushGraphics()
NSGraphicsContext.restoreGraphicsState()
// Get NSData, and save it
let data = rep?.representation(using: .png, properties: [:]) // properties as! [String : Any]) //
do {
try data?.write(to: url)
return true
}
catch {
return false
}
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…