我有一个 pdf,我正在将 pdf 转换为图像并在
UIImageView
中显示,然后在将该图像转换为 Base 64 后,但在转换 Base 64 时我正在丢失图像质量,所以有什么方法可以防止丢失质量转换为基数 64 时
请告诉我有什么解决办法吗
这是我的转换代码
let previewImage1 = convertedImageView.getImage()
let btnImg = UIButton()
btnImg.setImage(previewImage1, for: .normal)
let btn1Imggg2 = btnImg.image(for: .normal)
let imageData2 = btnImg?.jpegData(compressionQuality: 0.0)
let imgString2 = imageData2!.base64EncodedString(options: .init(rawValue: 0))
即使我将压缩质量设置为 0.0 仍然是压缩图像
我有
UIView
里面我有ScrollView
里面我有ImageView
并且我正在将整个UIView
转换为图像,然后转换为base64,这就是场景希望这可以帮助您理解
代码
UIView
至 UIImage
func getImage(scale: CGFloat? = nil) -> UIImage {
let newScale = scale ?? UIScreen.main.scale
self.scale(by: newScale)
let format = UIGraphicsImageRendererFormat()
format.scale = newScale
let renderer = UIGraphicsImageRenderer(size: self.bounds.size, format: format)
let image = renderer.image { rendererContext in
self.layer.render(in: rendererContext.cgContext)
}
return image
}
通过这样做
let imageData2 = btnImg?.jpegData(compressionQuality: 0.0)
您正在使用可能的最大值压缩图像。将此代码更改为
let imageData2 = btnImg?.jpegData(compressionQuality: 1.0)
你就可以出发了。
当您将 UIView 转换为 UIImage 时,下面的函数可能对您有用:
func image(with view: UIView) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
defer { UIGraphicsEndImageContext() }
if let context = UIGraphicsGetCurrentContext() {
view.layer.render(in: context)
let image = UIGraphicsGetImageFromCurrentImageContext()
return image
}
return nil
}
如果jpeg数据不能满足您的要求,则用户像这样的pngData
let imageData2 = btnImg?.pngData()
转换为图像后,应用您现在正在做的 Base64 转换。
好吧,由于您有一个嵌套的层次结构(UIView -> UIScrollView -> UIImageView)并且您不想将整个层次结构捕获为图像,因此最好从 UIView 制作图像(层次结构中的最顶层,除非我理解错了,你不仅仅想要 UIImageView 部分)
let parentMostView = (the view you want to create into an image)
UIGraphicsBeginImageContextWithOptions(size: parentMostView.frame.size, NO, UIScreen.main.scale)
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGrapgicsEndImageContext()
let imageAsData = image.pngData()
//do your base64 conversion here
编辑:看到您的图像创建代码后
我没有发现您的
getImage(:)
方法有任何问题。您正在测试什么设备(较低规模的设备会创建低分辨率图像,因为您依赖于设备规模)?尝试使用较高的静态比例值(例如 10)并将数据转换替换为 .jpegData(compressionQuality: 1.0)
或 .pngData()