OSX-使用Swift加载图像并将其另存为较小的png文件

kamisama42

我正在寻找一种上传图像文件,调整其大小(以减小总文件大小),然后将其另存为png的方法。我认为必须有一种相当简单的方法来执行此操作,但是经过数小时的搜索并没有产生有效的结果。通过将图像导出为压缩的JPEG,我已经能够达到所需的文件大小,但是我需要保留透明度。这是我用来获取JPEG的代码:

func chooseImage ()  {
    var image = NSImage()

    //choose image from hard disk
    let panel = NSOpenPanel()
    panel.allowsMultipleSelection = false
    panel.canChooseFiles = true
    panel.canChooseDirectories = false
    panel.runModal()
    panel.allowedFileTypes = ["png", "jpeg", "jpg"]

    let chosenFile = panel.URL

    //convert to NSData and send to Jpeg function
    if chosenFile != nil {
        image = NSImage(contentsOfURL: chosenFile!)!
        let imageData = image.TIFFRepresentation
        self.saveAsJpeg(imageData!, compression: 0.5)
    }
}




func saveAsJpeg (image:NSData, compression:NSNumber)  {
    // make imagerep and define properties
    let imgRep = NSBitmapImageRep(data: image)
    let props = NSDictionary.init(object: compression, forKey: NSImageCompressionFactor)
    let pingy = imgRep?.representationUsingType(NSBitmapImageFileType.NSJPEGFileType, properties: props as! [String : AnyObject])

    //save to disk
    let documentURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
    let folderURL = documentURL.URLByAppendingPathComponent("KKNightlife Data")

    let g = GetUniqueID()
    let fileName = g.getUniqueID() + ".jpeg"

    do {
        try NSFileManager.defaultManager().createDirectoryAtURL(folderURL, withIntermediateDirectories: false, attributes: nil)
    } catch  {
        print("cannot create directory - folder Exists?")
    }
    let url = folderURL.URLByAppendingPathComponent(fileName)

    if let pid = pingy {
        pid.writeToURL(url, atomically: false)
    } else {
        print("error saving image")
    }
}

我试图使用以下代码缩放图像以创建较小的.png文件,但是无论我输入的大小值是多少,生成的文件都是相同的大小(在高度/宽度和整个文件方面)尺寸):

func chooseImage (size:String) {
    let panel = NSOpenPanel()
    panel.allowsMultipleSelection = false
    panel.canChooseFiles = true
    panel.canChooseDirectories = false
    panel.runModal()
    panel.allowedFileTypes = ["png", "jpeg", "jpg"]

    let chosenFile = panel.URL

    if chosenFile != nil {
        let image = NSImage(contentsOfURL: chosenFile!)
        self.scaleImage(image!)
    }
}


func scaleImage (image:NSImage) {

    //create resized image
    let newSize = NSSize(width: 10, height: 10)
    var imageRect:CGRect = CGRectMake(0, 0, image.size.width, image.size.height)
    let imageRef = image.CGImageForProposedRect(&imageRect, context: nil, hints: nil)
    let resizedImage = NSImage(CGImage: imageRef!, size: newSize)

    let imageData = resizedImage.TIFFRepresentation

    //make imagerep
    let imgRep = NSBitmapImageRep(data: imageData!)
    let pingy = imgRep?.representationUsingType(NSBitmapImageFileType.NSPNGFileType, properties:  [:])

    //save to disk
    let documentURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
    let g = GetUniqueID()
    let fileName = g.getUniqueID() + ".png"

    let folderURL = documentURL.URLByAppendingPathComponent("KKNightlife Data")
    do {
        try NSFileManager.defaultManager().createDirectoryAtURL(folderURL, withIntermediateDirectories: false, attributes: nil)
    } catch  {
        print("cannot create directory - folder Exists?")
    }
    let url = folderURL.URLByAppendingPathComponent(fileName)
    if let pid = pingy {
        pid.writeToURL(url, atomically: false)
        print("image is at \(documentURL)")
    } else {
        print("error saving image")
    }
}

任何建议将不胜感激。

kamisama42

我终于能够使用在这里找到的扩展名来做到这一点:https : //gist.github.com/raphaelhanneken/cb924aa280f4b9dbb480

如果有人遇到类似问题,这就是我最终给他们打电话的方式:

func chooseImage (size:String) {
    let panel = NSOpenPanel()
    panel.allowsMultipleSelection = false
    panel.canChooseFiles = true
    panel.canChooseDirectories = false
    panel.runModal()
    panel.allowedFileTypes = ["png", "jpeg", "jpg"]

    let chosenFile = panel.URL

    if chosenFile != nil {
        let image = NSImage(contentsOfURL: chosenFile!)
        self.scaleImageUsingExtensions(image!)
    }
}

func scaleImageUsingExtensions (image:NSImage){
    let size: NSSize = NSMakeSize(10, 10)
    let resizedImage = image.resizeWhileMaintainingAspectRatioToSize(size)
    let documentURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first!
    let g = GetUniqueID()
    let fileName = g.getUniqueID() + ".png"

    let folderURL = documentURL.URLByAppendingPathComponent("KKNightlife Data")
    do {
        try NSFileManager.defaultManager().createDirectoryAtURL(folderURL, withIntermediateDirectories: false, attributes: nil)
    } catch  {
        print("cannot create directory - folder Exists?")
    }
    let url = folderURL.URLByAppendingPathComponent(fileName)
    do {

    try resizedImage?.savePNGRepresentationToURL(url)

    }
    catch {
        print("error saving file")
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章