2016-08-30 32 views
0

我正在寻找上传图像文件,调整其大小(以缩小文件总大小)的方法,然后将其另存为PNG。我认为这样做肯定有一个相当直接的方法,但几个小时的搜索没有取得有效的结果。我已经能够通过以压缩的JPEG格式导出图像来实现所需的文件大小,但我需要保持透明度。下面是我用来获取JPEG代码:OSX - 使用Swift加载图像并将其保存为较小的PNG文件

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") 
    } 
} 

任何建议,将不胜感激。

回答

0

我终于能够使用这个发现这里的扩展做: 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") 
    } 
} 
相关问题