Как сжать NSImage в Swift 4 - PullRequest
       25

Как сжать NSImage в Swift 4

0 голосов
/ 08 октября 2018

Я занимаюсь разработкой приложения для Mac OS, я не могу найти какой-либо метод для compressing NSImage и преобразовать их в base64 кодированную строку для Swift 4.

Вряд ли я нашел Swift3код

 func compressUnderMegaBytes(megabytes: CGFloat) -> NSImage? {
        var compressionRatio = 1.0
        var imageRep = NSBitmapImageRep(data: self.tiffRepresentation!)
        var options = NSDictionary(object: NSNumber(floatLiteral: compressionRatio), forKey: NSBitmapImageRep.PropertyKey.compressionFactor as NSCopying)
        var compressedData: Data? = imageRep?.representation(using: .jpeg, properties: options as! [NSBitmapImageRep.PropertyKey : Any])
        while compressedData?.length > (megabytes * 1024 * 1024) {
            compressionRatio = compressionRatio * 0.9
            options = NSDictionary(object: NSNumber(floatLiteral:compressionRatio), forKey: NSBitmapImageRep.PropertyKey.compressionFactor as NSCopying)
            compressedData = imageRep?.representation(using:.png, properties: options as! [NSBitmapImageRep.PropertyKey : Any])
            if compressionRatio <= 0.4 {
                break
            }
        }
        return NSImage(data: compressedData!)
    }

но после конвертации в Swift 4 получаю следующую ошибку

enter image description here

1 Ответ

0 голосов
/ 08 октября 2018

переведенный код довольно громоздок.NSDictionary объезд не требуется в Swift 4.

length был переименован в count

extension NSImage {
    func compressUnderMegaBytes(megabytes: CGFloat) -> NSImage? {

        var compressionRatio = 1.0
        guard let tiff = self.tiffRepresentation, let imageRep = NSBitmapImageRep(data: tiff) else { return nil }
        var compressedData = imageRep.representation(using: .jpeg, properties: [.compressionFactor : compressionRatio])!
        while CGFloat(compressedData.count) > megabytes * 1024 * 1024 {
            compressionRatio = compressionRatio * 0.9
            compressedData = imageRep.representation(using: .png, properties:  [.compressionFactor : compressionRatio])!
            if compressionRatio <= 0.4 {
                break
            }
        }
        return NSImage(data: compressedData)
    }
}

Или без небезопасных развернутых опций

extension NSImage {
    func compressUnderMegaBytes(megabytes: CGFloat) -> NSImage? {

        var compressionRatio = 1.0
        guard let tiff = self.tiffRepresentation, let imageRep = NSBitmapImageRep(data: tiff) else { return nil }
        var compressedData = imageRep.representation(using: .jpeg, properties: [.compressionFactor : compressionRatio])
        if compressedData == nil { return self }
        while CGFloat(compressedData!.count) > megabytes * 1024 * 1024 {
            compressionRatio = compressionRatio * 0.9
            let newCompressedData = imageRep.representation(using: .png, properties:  [.compressionFactor : compressionRatio])
            if compressionRatio <= 0.4 || newCompressedData == nil {
                break
            }
            compressedData = newCompressedData
        }
        return NSImage(data: compressedData!)
    }
}

Примечание. Предусматривается ли сжатие в первый раз как jpg, а затем как png?

...