对Base64字符串的NSI映像失去了质量

时间:2017-03-02 14:15:41

标签: swift cocoa base64 nsimage

我试图将NSImage从NSImageView转换为Base64字符串,但在解码输出时最终会失去一半的质量。

转换为Base64的代码似乎很简单,我已将其放入NSString扩展中:

extension NSImage {

    func base64String() -> String? {
        guard
            let bits = self.representations.first as? NSBitmapImageRep,
            let data = bits.representation(using: .JPEG, properties: [:])
        else {
            return nil
        }

        return "data:image/jpeg;base64,\(data.base64EncodedString())"
    }
}

尝试使用测试JPG图像将39KB解码回20KB。我尝试使用在线工具转换相同的图像并获得完美的编码 - >解码。

我试过的其他代码:

func base64String() -> String? {
    let cgImgRef = self.cgImage(forProposedRect: nil, context: nil, hints: nil)
    let bmpImgRef = NSBitmapImageRep(cgImage: cgImgRef!)
    let data = bmpImgRef.representation(using: NSBitmapImageFileType.JPEG, properties: [:])!
    return "data:image/jpeg;base64,\(data.base64EncodedString())"
}

这导致17KB文件。

任何帮助都会非常感激,因为我已经将这个问题困扰了几个小时。

2 个答案:

答案 0 :(得分:1)

您尚未指定压缩值,因此默认为默认压缩。要不进行压缩,请使用以下代码:

let data = bits.representation(using: .JPEG, properties: [NSImageCompressionFactor:1.0])

答案 1 :(得分:1)

根据documentationNSBitmapImageRep呈现图片。您的代码似乎再次将图像重新编码为 jpeg 。由于 jpeg 是一种松散的算法,这将导致质量下降。您可以尝试:

  • 使用 png 作为表示
  • jpeg 使用高(或1.0)压缩因子。