我试图将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文件。
任何帮助都会非常感激,因为我已经将这个问题困扰了几个小时。
答案 0 :(得分:1)
您尚未指定压缩值,因此默认为默认压缩。要不进行压缩,请使用以下代码:
let data = bits.representation(using: .JPEG, properties: [NSImageCompressionFactor:1.0])
答案 1 :(得分:1)
根据documentation,NSBitmapImageRep
呈现图片。您的代码似乎再次将图像重新编码为 jpeg 。由于 jpeg 是一种松散的算法,这将导致质量下降。您可以尝试: