2016-08-30 6 views
0

Я ищу способ загрузить файл изображения, изменить его размер (чтобы уменьшить общий размер файла), а затем сохранить его как PNG. Я думаю, что должен быть довольно простой способ сделать это, но часы поиска вокруг не дали никаких эффективных результатов. Я смог добиться желаемого размера файла, экспортировав изображение в сжатом формате JPEG, но мне нужно сохранить прозрачность. Вот код, который я использовал, чтобы получить JPEG:OSX - Загрузка изображения и сохранение его в виде меньшего файла png с помощью Swift

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