0

请检查我有 atteche

我有一个 pdf,我正在将 pdf 转换为图像并显示,UIImageView然后在将该图像转换为 base 64 之后,但是在转换 base 64 时,我失去了图像质量,所以有什么办法可以防止在转换为 base 时丢失质量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,这是场景希望这可以帮助你理解

代码UIViewUIImage

 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
    }
4

2 回答 2

4

通过做这个

   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()

转换为 Image 后,像现在一样应用 base64 转换。

于 2019-05-30T09:17:48.607 回答
2

好的,因为你有一个嵌套层次结构(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()

于 2019-05-30T09:51:44.937 回答